思路与前一致,前一版的主要瓶颈在于有太多重复的数据,若可以将这些重复的数据统计到一起,可以极大的减少对比次数。 [[3], [2], [1]] 现在变为 [[(3, 1)], [(2, 1)], [(1, 1)]] 即缩小重复的数据的检测结果。 例: [5, 6, 5, 3, 1, 8, 1, 1, 3, 5], [[5], [6, 6], [5, 6, 6], [3, 5, 6, 6], [1, 3, 5, 6, 6], [8, 8, 8, 8, 8, 8],
(a, b)
| 81 | # |
| 82 | |
| 83 | def maxALEminB(a, b): |
| 84 | """ |
| 85 | 思路与前一致,前一版的主要瓶颈在于有太多重复的数据,若可以将这些重复的数据统计到一起,可以极大的减少对比次数。 |
| 86 | [[3], [2], [1]] |
| 87 | 现在变为 |
| 88 | [[(3, 1)], [(2, 1)], [(1, 1)]] |
| 89 | 即缩小重复的数据的检测结果。 |
| 90 | 例: |
| 91 | [5, 6, 5, 3, 1, 8, 1, 1, 3, 5], |
| 92 | [[5], [6, 6], [5, 6, 6], [3, 5, 6, 6], [1, 3, 5, 6, 6], [8, 8, 8, 8, 8, 8], ...] |
| 93 | dp1的检测为,若当前的值大于之前中的值的某一个[-1:0],从前到后是按升序排列的。 |
| 94 | 就从最初出现的那个地方截断,之前的值全部替换为此最大值,若没有一个大于的,则直接将之前的追加到当前的结果中。 |
| 95 | dp2的检测只将 大于 变为 小于。 |
| 96 | |
| 97 | 关于对比: |
| 98 | 每一组的个数可能不同,但总量是一致的。 |
| 99 | 两组同时取出自己的一个数据,若b > a则结果中加上 b 和 a 中出现的次数较少的一个。并减去,开始下一轮,b或a中任意一个的出现次数为0时, |
| 100 | 取出相应的本组的下一个数据,同时为0时开始下一轮循环。 |
| 101 | """ |
| 102 | dp1 = [[[i, 1]] for i in a] |
| 103 | dp2 = [[[i, 1]] for i in b] |
| 104 | |
| 105 | # [ |
| 106 | # [ |
| 107 | # [i, 1] |
| 108 | # ] |
| 109 | # ] |
| 110 | for i in range(1, len(dp1)): |
| 111 | value = dp1[i][0] |
| 112 | j = dp1[i-1] |
| 113 | |
| 114 | # 二次优化后提高了 0.2 s. |
| 115 | if j[0][0] > value[0]: |
| 116 | dp1[i].extend(j) |
| 117 | continue |
| 118 | |
| 119 | for x in range(len(j)-1, -1, -1): |
| 120 | x2 = j[x] |
| 121 | if x2[0] <= value[0]: |
| 122 | dp1[i] = [[value[0], sum([t[1] for t in j[:x+1]])+1]] + j[x+1:] |
| 123 | break |
| 124 | |
| 125 | for i in range(1, len(dp2)): |
| 126 | value = dp2[i][0] |
| 127 | j = dp2[i-1] |
| 128 | if j[0][0] <= value[0]: |
| 129 | dp2[i].extend(j) |
| 130 | continue |
| 131 | |
| 132 | for x in range(len(j)-1, -1, -1): |
| 133 | x2 = j[x] |
| 134 | if x2[0] >= value[0]: |
| 135 | dp2[i] = [[value[0], sum([t[1] for t in j[:x+1]])+1]] + j[x+1:] |
| 136 | break |
| 137 | |
| 138 | result = 0 |
| 139 | for i, j in zip(dp1, dp2): |
| 140 | valueA = 0 |
no test coverage detected