【问题标题】:Does doubly-linked-list can be O(log n) if I search in the middle?如果我在中间搜索,双向链表可以是 O(log n) 吗?
【发布时间】:2018-04-08 10:06:28
【问题描述】:

如果我在列表中间搜索并且它按升序排序

10 20 30 40 50

然后想象我搜索“20”然后选择 30(在中间)

10 20 30 40 50

然后我可以在双向链表中向左移动所以向左移动(选择 20)

10 20 30 40 50

会不会是 O(log n) 因为搜索时间减半?

【问题讨论】:

  • O(n/2) = O(n) .
  • 如何在不遍历一半列表的情况下访问中间点?例如,如果您尝试访问第 250 个元素,那么会发生什么情况?你的技术在这里有问题
  • @JillAndMe:不,你理解 big-O notation 就好了,因为你知道二分搜索有一定的复杂性。您唯一缺少的是将该符号应用于此特定情况:-)

标签: algorithm doubly-linked-list


【解决方案1】:

使二分搜索(您正在讨论的内容)成为可能的是能够在恒定时间内到达集合中的任何元素,O(1)

这意味着数组是一种可能性,因为您可以将基址和索引转换为O(1) 中的内存位置。例如,如果数组基于字节位置 314159,并且每个元素的大小为 7 个字节,则可以在 314159 + 42 * 7 = 314453 找到元素 42。

链表,即使是双链表,也无法做到这一点,因为为了找到一个元素,你必须从头部或尾部遍历直到到达那里(事实上,你不需要知道你已经到了那里,除非你把它们全部遍历或方便计数)。

所以,对于一个链表,它非常像一个O(n) 方法来查找给定元素。

【讨论】:

    【解决方案2】:

    只有在线性 O(n) 时间内才有可能。这是整个解释。 https://stackoverflow.com/a/19554432/3457707 主要是您无法直接访问每个元素,因此访问时间不像数组中那样恒定。所以每次你必须遍历元素时,你不能像在数组中那样跳过它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      相关资源
      最近更新 更多