向量ADT
向量 ADT 操作实例
回顾:无序向量 – 去重
- 去重
deduplicate()
功能:删除重复元素 [ ,返回元素删除总数 ]
有序向量 – 有序性及其甄别
- 有序性及其甄别
有序向量 – 唯一化
- 低效算法
- 低效算法复杂度
- 高效算法
- 高效算法复杂度
向量唯一化总结
有序向量 - 查找算法
- 查找
search ( e, lo, hi )
在有序向量中查找只等于 e 的元素的位置
如何处理特殊情况?
比如,目标元素不存在;或者反过来,目标元素同时存在多个
- 语义约定
search 接口至少应该有利于有序向量自身的维护:
V.insert ( 1 + V.search(e), e ) 即便查找失败,也应该给出新元素适当的插入位置 若允许重复元素,则每一组也需按其插入的次序排列
在有序向量区间 V [ lo, hi ) 中,确定不大于 e 的最后一个元素
当有多个命中元素时,必须返回 最靠后(秩最大)者
失败时,应返回 小于 e 的最大者
若 –∞ < e < V [ lo ], 则返回 lo – 1 ( 左侧哨兵 )
若 V [ hi - 1 ] < e < +∞,则返回 hi – 1 ( 末元素 = 右侧哨兵左邻 )
- 统一接口
- 二分查找思想
思考:
这种方式是否满足我们定义的语义?
正确性
不变性:A[ 0, lo ) <= e < A[ hi, n )
- Fibonacci 查找算法
- 插值查找
插值查找算法最坏情况实例