我有一个包含字符串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
答案 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)