如果我在中间搜索,双向链表可以是 O(log n) 吗?
Does doubly-linked-list can be O(log n) if I search in the middle?
如果我在列表中间搜索并且它按升序排序,如
10 20 30 40 50
然后假设我搜索“20”然后选择 30(在中间)
10 20 30 40 50
然后我可以在双向链表中向左移动所以向左移动(选择 20)
10 20 30 40 50
是否可以是O(log n)因为搜索时间减半?
只可能在线性O(n)时间内。这是整个解释。 最主要的是你不能直接访问每个元素,所以访问时间不像在数组中那样是常量。所以每次你必须遍历元素时,你不能像在数组中那样跳过它们。
使二进制搜索(这就是您正在讨论的内容)成为可能的是能够在恒定时间内获取集合中的任何元素,O(1)
。
这意味着数组是一种可能性,因为您可以将基数和索引转换为 O(1)
中的内存位置。例如,如果数组基于字节位置 314159 并且每个元素的大小为七个字节,则可以在 314159 + 42 * 7 = 314453
.
处找到元素 42
链表,即使是双向链表,也无法做到这一点,因为为了找到一个元素,您必须从头部或尾部遍历直到到达那里(事实上,您不需要 不知道 你已经到达那里,除非你遍历所有这些或手头有计数)。
因此,对于链表,它是一种非常重要的 O(n)
方法来查找给定的元素。
如果我在列表中间搜索并且它按升序排序,如
10 20 30 40 50
然后假设我搜索“20”然后选择 30(在中间)
10 20 30 40 50
然后我可以在双向链表中向左移动所以向左移动(选择 20)
10 20 30 40 50
是否可以是O(log n)因为搜索时间减半?
只可能在线性O(n)时间内。这是整个解释。 最主要的是你不能直接访问每个元素,所以访问时间不像在数组中那样是常量。所以每次你必须遍历元素时,你不能像在数组中那样跳过它们。
使二进制搜索(这就是您正在讨论的内容)成为可能的是能够在恒定时间内获取集合中的任何元素,O(1)
。
这意味着数组是一种可能性,因为您可以将基数和索引转换为 O(1)
中的内存位置。例如,如果数组基于字节位置 314159 并且每个元素的大小为七个字节,则可以在 314159 + 42 * 7 = 314453
.
链表,即使是双向链表,也无法做到这一点,因为为了找到一个元素,您必须从头部或尾部遍历直到到达那里(事实上,您不需要 不知道 你已经到达那里,除非你遍历所有这些或手头有计数)。
因此,对于链表,它是一种非常重要的 O(n)
方法来查找给定的元素。