顺序搜索需要o(n ^ 2)时间。希望它是O(1)或O(log n)

时间:2014-11-18 13:03:54

标签: search python-3.x big-o

我有一个包含字符串NOT SORTED ORDER的列表。因此,不能使用二进制搜索。我的要求是每个项目必须找到它的下一个出现。即在给定列表中,在处理时,第一个项目将搜索其下一个出现的项目(倒数第二个项目),依此类推。

[
    "/Users/Rash/Downloads/file1.txt", "/Users/Rash/Downloads/file2.txt",
    "/Users/Rash/Downloads/Programs/File1.txt", "/Users/Rash/Downloads/file1.txt",
    "/Users/Rash/Downloads/file2.txt"
]

我的代码是:

for item in mylist:
    process(item, nextOccurrenceOfItem)

在上面的代码中,请注意我必须传递" nextOccurrenceOfItem"。所以,我需要搜索列表。如果我进行顺序搜索,则需要的时间是:

n + (n-1) + (n-2) + ... + 2 + 1 = n(n+1)/2 =~ O(n^2)

我想要一些python函数,可以在更短的时间内搜索,更像是O(1)或O(log n)。 列表太大,就像1000个条目一样。因此需要较少的搜索时间算法。

我本来可以维护一个排序列表,并且可以将python的bisect函数与二进制数组一起使用,并且可以进行二进制排序,但维护该列表是另一个令人头痛的问题,更不用说它们会由于列表很大,因此占用内存。

我也想知道是否有办法在O(1)时间内进行搜索,并且是由python提供的?

我正在使用python3.4

1 个答案:

答案 0 :(得分:1)

您可以使用字典为主列表中的每个唯一元素生成基本上为linked list(LL)的内容。您还可以使用字典将每个元素映射到它的“链接列表”。您可以在O(N)中构建数据结构,然后查找下一个(或以后需要的时候)元素O(1)

如果您需要更改主列表而不重建数据结构,那么您应该使用binary search tree (BST)(更准确的树形图)来构建O(N log N)O(log N)下一个/上一个查询。将索引为E的{​​{1}}元素更改为i,然后从B的LL中删除i,并将E添加到LL对于i,费用为B

链表(或BST)中的每个项目代表主列表中的索引。链表中的下一个项目是该元素出现的下一个索引。

Python代码看起来像这样(最好实现为类,为简单起见使用函数)。链接列表实现留作练习。

O(log N)