二分法查找为什么只适用于顺序存储

如题所述

二分查找法只适用于顺序存储,而且只适用于有序序列。

顺序存储是指用一段地址连续的存储单元存储相邻数据元素,比如我们常用的数组。这是一个物理上的概念。和它相对的是链式存储。

有序序列是指一个序列中的所有元素已经按照某种确定的方式排好了序,比如最简单的 int 数组的由小到大(或由大到小)。这是一个逻辑上的概念。

二分查找法指的是在有序的序列中查找某一元素,利用该序列已经有序的特点,每次比较范围中间的元素与目标元素的大小,即可确定目标值在中间值的前面还是后面,这样每次比较都能把查找范围缩小一半,达到快速查找的目的。

很显然,适用二分查找法的序列要满足两个条件:一是该序列内的元素是有序排列的(这很显然);二是该序列能够让程序直接访问它范围中间的元素,也就是需要能够随机存取


我们知道链式存储是不支持随机存取的,比如一个单链表,我们想访问其中的第几个元素,就得从头结点开始一个一个往后查找,这种情况下非要用二分查找法实在是逆大天。


上面看完如果还是不太理解的话,我们可以具体分析一下:

二分查找本身是 T(logN)

对于顺序存储,随机存取是 T(1),不管你多长,给个下标我就飞过去了。那么顺序存储二分查找法的时间复杂度就是 O(logN)

对于单链表,访问中间元素就得从头开始,把前面一半的结点都走一遍,T(N/2)。那么单链表二分查找法的时间复杂度就达到了 O(NlogN),要知道最简单的直接查找也就 O(N)

那么双向链表呢?也没有好到哪去,双向链表做二分查找法的时间复杂度也是 O(N),在某些情况下会比直接查找快一些,但仅此而已了。


至于二叉树等结构,由于已经不属于线性存储结构,这里就不讨论。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-09-08
举个例子,在1 2 6 4 5 7 8 9 10中,你要用二分法查找6,你得先把6跟中间的5比较,6很明显大于5,所以就只能在5 7 8 9 10中查找,这样很明显找不到,所以二分法必须要求用于顺序排列的数,如果不是顺序排列的,二分法就完全没有意义本回答被提问者采纳
第2个回答  2021-04-12
二分法查找的存储结构仅限于___顺序存储结构____且是有序的。
解析:二分查找,也称折半查找,它是一种高效率的查找方法。但二分查找有条件限制:要求表必须用顺序存储结构,且表中元素必须按关键字有序(升序或降序均可)。
第3个回答  2010-09-09
谁说只能用于顺序存储的,链式存储也可以,你看一下关于二分法的算法描述中,什么地方提到了只能用顺序存储。
算法与其具体实现,是不相干的。只能说某些算法,用某些实现方式更为方便一些。
第4个回答  2010-09-08
二分法查找的时候如果不是按照顺序排的话,那么跟直接一个一个查找是一样的,算法复杂度是O(n),如果是顺序存储的话就是O[log(n)]
相似回答