Algorithm 二进制搜索访问中间元素的缺点

Algorithm 二进制搜索访问中间元素的缺点,algorithm,python-2.7,data-structures,binary-search,Algorithm,Python 2.7,Data Structures,Binary Search,我正在学习西摩·利普舒茨(Seymour Lipschutz)的《数据结构》一书,我遇到了一个我不完全理解的问题 二进制搜索算法假设一个人可以直接访问列表中的中间元素。这意味着列表必须存储在某种类型的线性数组中 我读了这篇文章,还认识到在Python中,您可以随时访问中间元素。然后书接着说: 不幸的是,在数组中插入元素需要元素在列表中下移,而从数组中删除元素需要元素在列表中上移 这是什么缺点? 我们还可以通过将数组长度除以2来访问中间元素吗?作者似乎比较了类似数组的结构和链接的列表 第一个(数组

我正在学习西摩·利普舒茨(Seymour Lipschutz)的《数据结构》一书,我遇到了一个我不完全理解的问题

二进制搜索算法假设一个人可以直接访问列表中的中间元素。这意味着列表必须存储在某种类型的线性数组中

我读了这篇文章,还认识到在Python中,您可以随时访问中间元素。然后书接着说:

不幸的是,在数组中插入元素需要元素在列表中下移,而从数组中删除元素需要元素在列表中上移

这是什么缺点?
我们还可以通过将数组长度除以2来访问中间元素吗?

作者似乎比较了类似数组的结构和链接的列表

第一个(数组、Python和java列表、C++向量)允许快速、简单地访问任何元素,但添加、插入或删除可能导致内存重新分配。


对于第二个元素,我们不能直接处理第i个元素,我们需要从头遍历列表,但当我们有元素时,我们可以快速插入或删除。

作者似乎比较了类似数组的结构和链接的列表

第一个(数组、Python和java列表、C++向量)允许快速、简单地访问任何元素,但添加、插入或删除可能导致内存重新分配。


对于第二个元素,我们不能直接处理第i个元素,我们需要从头遍历列表,但当我们有元素时,我们可以快速插入或删除。

在不修改数组的情况下,插入和删除的成本是无关的

但是,如果要使用数组来维护一组已排序的非固定项,则插入和删除成本是相关的。在这种情况下,二进制搜索可用于查找项目(可能用于删除)和/或查找应插入新项目的位置。缺点是插入和删除需要移动其他元素

Python的模块提供了二进制搜索功能,可用于定位插入点以维持排序顺序。上述缺点适用


在某些情况下,对于维护非固定项目的排序集,a可能是排序数组的首选替代方案。

在不修改数组的情况下,插入和删除的成本不相关

但是,如果要使用数组来维护一组已排序的非固定项,则插入和删除成本是相关的。在这种情况下,二进制搜索可用于查找项目(可能用于删除)和/或查找应插入新项目的位置。缺点是插入和删除需要移动其他元素

Python的模块提供了二进制搜索功能,可用于定位插入点以维持排序顺序。上述缺点适用


在某些情况下,对于维护非固定项的排序集而言,a可能是排序数组的更好替代方案。

从这些引用来看,这本书不太好看,例如,二进制搜索不仅适用于列表,而且还适用于单调函数,为什么在二进制搜索期间需要插入/删除某些内容?您只需保留左/右边框的变量并更改这些变量,这样插入/删除就不是一个缺点。删除和插入不会在搜索过程中进行,而是更新记录……在这种情况下,更新将采取
O(n)
和搜索
O(logn)
如果使用数组和
O(1)
O(n)
如果使用链表如果有很多更新当然这很慢,使用一些树结构我们可以在
O(log n)
中实现更新/搜索这本书从这些引用中看起来不太好,例如二进制搜索也适用于单调函数而不仅仅是列表,为什么在二进制搜索过程中需要插入/删除某些内容?您只需保留左/右边框的变量并更改这些变量,这样插入/删除就不是一个缺点。删除和插入不会在搜索过程中进行,而是更新记录……在这种情况下,更新将采取
O(n)
和搜索
O(logn)
如果使用数组和
O(1)
O(n)
如果使用链表如果有很多更新,这当然很慢,使用一些树结构,我们可以在
O(log n)