标签:一个 方法 是的 IV 分享图片 pos 结果 range get
题目:
有两种思路,一种是采用简单的搜索,可以一个一个的向上检索,直到匹配;另外一种是采用折半查找,如果存在array[middle]==target那么直接返回target的位置,否则的话,找到low和high相等的位置,判断数组中此位置的值是否大于等于target,是的话就直接返回low,否则返回low+1;
第一种思路的代码:
def true_index_search(array, target): index = 0 while index < len(array): if target == array[index]: break elif target < array[index]: break else: index += 1 return index
我测试了第一种方法在leetcode上的效率:
第二种思路的代码:
def search_index(array, target): high = len(array) low = 0 if high == 0 or array[0] > target: return 0 elif array[high-1] < target: return high else: high -= 1 while high > low: middle = int(low + (high - low)/2) if array[middle] == target: return middle else: if array[middle] > target: high = middle - 1 else: low = middle + 1 if array[low] >= target: return low else: return low+1
我测试了第二种方法在leetcode上的效率:
我写了一个测试程序,判断第二个程序的正确率:
import random def test_function(): times = 100000 right = 0 for time in range(times): len = random.randint(0, 1000) array = [] for i in range(len): array.append(random.randint(0, 1000)) array_set = list(set(array)) array_set.sort() target = random.randint(0, 10000) myvalue = search_index(array_set, target) true_value = true_index_search(array_set, target) if myvalue == true_value: right += 1 return float(right)/float(times) if __name__ == "__main__": value = test_function() print(value)
结果如下:
可以看到第二种方法和第一种方法的效果相同,但是第二种方法的效率要比第一种方法高得多。在用折半查找做这道题的时候, 要特别注意判断条件。
标签:一个 方法 是的 IV 分享图片 pos 结果 range get
原文地址:https://www.cnblogs.com/whatyouknow123/p/9202552.html