有序向量

向量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 查找算法

 

  • 插值查找

 

 

 

 

 

 插值查找算法最坏情况实例

 

 

 

posted on 2020-10-23 10:48  switch大咖  阅读(220)  评论(0编辑  收藏  举报