Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 分治算法,用于查找一个非';t重复_Algorithm_Binary Search - Fatal编程技术网

Algorithm 分治算法,用于查找一个非';t重复

Algorithm 分治算法,用于查找一个非';t重复,algorithm,binary-search,Algorithm,Binary Search,如果我有一个排序的整数列表,其中除一个元素外的每个元素都是重复的,那么如何在不到O(n)的时间内找到singleton元素呢 例如:(−2.−2,5,5,5,67,67,72,80,80,80,80)将返回72 我相当肯定二进制搜索涉及其中,但不确定如何实现它。我只是在这里寻找伪代码 我正在考虑遍历列表,并对当前元素的最后一次出现进行二进制搜索。如果它的索引与我们当前使用的索引相同,那就是singleton元素。如果没有,继续。我想那应该是O(nlogn) 如果每个整数可以重复任意次数,最好的算

如果我有一个排序的整数列表,其中除一个元素外的每个元素都是重复的,那么如何在不到O(n)的时间内找到singleton元素呢

例如:(−2.−2,5,5,5,67,67,72,80,80,80,80)将返回72

我相当肯定二进制搜索涉及其中,但不确定如何实现它。我只是在这里寻找伪代码


我正在考虑遍历列表,并对当前元素的最后一次出现进行二进制搜索。如果它的索引与我们当前使用的索引相同,那就是singleton元素。如果没有,继续。我想那应该是O(nlogn)

如果每个整数可以重复任意次数,最好的算法是
O(n)
,因为无法避免迭代每个整数。只需在列表中进行迭代,并保留一个计数器,指示在一行中找到了多少相同的整数。如果计数器只有一个,并且发现了一个新的整数,那么终止,因为我们已经找到了非重复整数

如果我们知道所有数字重复的次数相同(除了不重复的数字),我们可以使用二进制搜索来实现更好的时间复杂度。但是,根据您的示例问题,情况似乎并非如此。

O(n)Python实现:

def find_singletons(items):
    singletons = []
    a, b = items[:2]
    for item in items[2:]:
        if a != b and b != item:
            singletons.append(b)
        a, b = b, item
    return singletons


items = [-2, -2, 5, 5, 5, 67, 67, 72, 80, 80, 80, 80]
print(find_singletons(items))
# [72]

另一个O(n)Python实现(使用计数器):


输入总是排序的吗?是的,总是一个排序的列表。是什么让你认为这实际上是可能的?“我在考虑遍历列表”-你不能在少于O(N)timeO(N)def find_singletons2(items): singletons = [] count = 1 last_item = items[0] for item in items[1:]: if last_item != item: if count == 1: singletons.append(last_item) count = 1 else: count += 1 last_item = item return singletons items = [-2, -2, 5, 5, 5, 67, 67, 72, 80, 80, 80, 80] print(find_singletons(items)) # [72]