Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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
Python 是否可以使用O(logn)链表搜索算法?_Python_Algorithm_Linked List - Fatal编程技术网

Python 是否可以使用O(logn)链表搜索算法?

Python 是否可以使用O(logn)链表搜索算法?,python,algorithm,linked-list,Python,Algorithm,Linked List,链表的搜索算法是否可能是O(logn)?根据我的理解,链表可以有O(n)或O(1),因为你可以选择从哪里开始,从链表的开始到结束。知道这一点,你能从中间开始寻找一个在O(log n)时间内运行的搜索算法吗?< P>一个O(log n)算法将需要 在固定时间内将列表划分为固定数量的部分,然后 确定搜索项处于固定时间的部分 e、 g.对于跟踪其大小的排序索引数组数据结构的二进制搜索算法,可以直接从数组大小计算分割点,并且可以通过与分割点处的项进行比较来确定搜索项是在前半部分还是在后半部分 但是对

链表的搜索算法是否可能是O(logn)?根据我的理解,链表可以有O(n)或O(1),因为你可以选择从哪里开始,从链表的开始到结束。知道这一点,你能从中间开始寻找一个在O(log n)时间内运行的搜索算法吗?

< P>一个O(log n)算法将需要

  • 在固定时间内将列表划分为固定数量的部分,然后
  • 确定搜索项处于固定时间的部分
e、 g.对于跟踪其大小的排序索引数组数据结构的二进制搜索算法,可以直接从数组大小计算分割点,并且可以通过与分割点处的项进行比较来确定搜索项是在前半部分还是在后半部分

但是对于链表,您不知道它的大小,必须遍历它才能找到拆分点。这是一个O(n)操作,因此整个算法不能是O(logn)


一般来说,第二个要求也不满足。

只有在能够以某种方式跳过读取元素的情况下,才有可能实现比O(n)更快的遍历,这是不可能的,除非您事先有某种方式知道要跳过什么,并且有额外的结构来跳转到列表的某些部分。如果在开始或结束时开始,则在找到要查找的内容之前,必须平均搜索n/2个元素。如果只有一个指针指向列表的中间,那么仍然需要在每个方向上搜索n/2,这没有帮助。我们需要的是更多的结构,比如强加一个分类标准。然后,通过对平均情况实现O(logn)“跳过车道”,可以在O(n)空间中实现该“跳过”,并在O(logn)时间中搜索。这种数据结构称为a,它保持快速的O(logn)插入。这些是与平衡树相同的渐近边界,但在概念上更接近链表。

而且我不确定你如何想象链表中的O(1)搜索算法工作。@mkrieger1我还没有尝试过任何东西,所有这些都只是完全概念性的/理论性的。如果要搜索的元素位于链表的开头或结尾,不是O(1)吗?Big-O表示最坏情况的摊销复杂性。元素是否位于您要查找的第一个位置并不重要-这不是最坏的情况。@patrickartner有道理。@patrickartner Big-O也可以表示平均情况,而不一定是最坏的情况。如果您有一个排序列表,您可以动态保留一个拆分点树,创建一个跳过列表。