趣题:在双向有序链表中查找指定的数
2009-01-16 13:15
190 查看
大家都知道,在一个有序数组里查找指定的数可以做到O(logn)的复杂度。但是大家想过没,在一个有序链表中又怎么样呢?让我们假设有这样一个链表,每个元素都严格小于它的后继元素。每个元素都能访问到自己的前驱元素和后继元素(如果有的话)。另外,我们知道每个元素在内存中的地址,因此可以进行随机存取。或者可以说,这个有序链表中的所有元素都是储存在一个数组中的,但数组本身并不有序。
现在,我们需要在这个链表中寻找一个指定的数x。你能否设计出一个平均复杂度低于O(n)的算法来?
下面是一个平均复杂度为O(√n)的算法。在数组中随机选取Θ(√n)个数,然后通过不断地比较更新,找出这些数当中比x小的最大的数(不妨记作p),以及比x大的最小的数(记作q)。从p所在的位置出发,沿着链表往下走,直到找到x或者走到q(表明x不在链表中)为止。
可以证明,O(√n)已经是最优的了。
现在,我们需要在这个链表中寻找一个指定的数x。你能否设计出一个平均复杂度低于O(n)的算法来?
下面是一个平均复杂度为O(√n)的算法。在数组中随机选取Θ(√n)个数,然后通过不断地比较更新,找出这些数当中比x小的最大的数(不妨记作p),以及比x大的最小的数(记作q)。从p所在的位置出发,沿着链表往下走,直到找到x或者走到q(表明x不在链表中)为止。
可以证明,O(√n)已经是最优的了。
相关文章推荐
- 链表节点面试100题系列之1将查找二叉树转换成有序的双向链表
- [微软面试100题] 二元查找数变成有序的双向链表
- 面试100题系列之1将查找二叉树转换成有序的双向链表
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 将二叉查找树转换为有序的双向链表
- Python 查找有序列表中指定元素所在位置
- 【数据结构作业二】写出单链表结点的结构体类型定义及查找、插入、删除算法,并以单链表作存储结构,实现有序表的合并
- 将二叉查找树转换成有序双向链表
- 单链表很类似于栈,先插入的后遍历,删除也是删除最后插进来的。但增加的指定查找和指定删除的方法增加了灵活性,可以删除、查找指定key
- 二叉搜索树转换为有序双向链表
- 二进制查找树转换为双向链表
- 反转单链表+合并有序单链表+查找单链表中倒数第k个节点--20150924
- 查找两个有序链表的相同部分
- 笔试算法题(05):转换BST为双向链表 & 查找栈中的最小元素
- 面试100题:14.求在有序数组中查找两个数的和为指定数
- 将双向链表转化为二叉堆并有序输出
- 将BST转换为有序的双向链表!
- 递增有序的双向链表演示
- 10实现有序双向循环链表的插入操作
- 单链表的创建和遍历、求单链表中节点的个数、查找单链表中的中间结点、判断单链表是否有环、取出有环链表中环的长度,删除有序链表中的重复结点