TsingHuaDSA-向量

该文章为清华大学数据结构与算法设计MOOC课程读书笔记.

1. 抽象数据类型 VS 数据结构

抽象数据类型 VS 数据结构

2. 向量ADT

2.1 有自己的一套接口操作

向量接口操作

2.2 可扩充性

  • 静态空间管理 Static Memory Management


    静态空间管理
  • 动态空间管理 Dynamic Memory Management

思路:即将上溢时,容量加倍

动态空间管理

为什么是容量加倍策略而不是容量递增个常数而已呢?
容量递增 -> 每次扩容操作的amortized time 为O(N)
容量加倍 -> 每次扩容操作的amortized time 为O(1)

容量递增 VS 容量加倍

  • 加倍扩容的耗时仅为紫色条的和
  • 加倍扩容是牺牲一定的空间利用率来换取时间的效率

3. 分摊复杂度

平均复杂度 VS 分摊复杂度

举个🌰:
在扩容分析的中,若只考虑独立操作,那么最坏情况复杂度都为O(N)(递增扩容中由n-1扩到n;加倍扩容由n/2到n)
然而,考虑了连续的一系列操作时,单次递增扩容的分摊时间为O(N^2 / N) = O(N);加倍扩容的分摊时间为O(N / N) = O(1)。✌️

4. 无序向量

实现了各种对应的操作...

其中一个比较有趣的是deduplicate() ---> 无序向量remove duplicate

  • 算法1:暴力
    思路:从前往后check每个元素,在它之前的元素中查重。若有重复,remove它,后面元素前移;若无重复,check下一个元素。
deduplicate()暴力实现

时间复杂度:O(N^2)


时间复杂度
  • 优化1:减少元素移动的次数
    思路:先对要删除的元素的标记,之后再统一删除。
    好处:保持了unique元素的稳定性
    时间:O(N^2) 比较次数没有变

  • 优化2:利用排序
    思路:因为重复元素肯定紧邻,因此可以在O(1)时间内找到duplicate
    时间:O(NlgN)

5. 有序向量

5.1 有序性以及逆序程度

有序性

5.2 去重uniquify()

  • 高效 O(N)
    • 思路:双指针
    • 关键:"隐式删除"
      需要删除的元素(即重复元素)并不会直接被remove,因此不会导致之后元素的前移。当发现非重复元素时,把该元素直接赋值到与之比较的元素之后,因此它们之前重复的元素相当于“被删除了”!


      有序向量高效去重

5.3 二分查找 search(e, lo, hi)--版本A

  • 原理


    二分原理
  • 实现


    实现
  • 复杂度 O(lgN)


    二分复杂度
  • 更精细的分析-查找长度
    抠系数分析 O(1.5lgN)


    查找长度

5.4 Fibonacci 查找

  • 原理


    Fib查找原理

与二分查找的本质区别:pivot(即mid)按黄金分割比例

  • 实现


    Fib查找实现
  • 复杂度-在系数上优于二分


    Fib查找长度

5.5 二分查找--版本B

  • 原理
    • 思路:对于每个向量(即每个比较区间),无论向左还是向右,需要的比较长度都是1。
    • 关键:只有两个分支:要么[lo, mi),要么[mi, hi],没有对x[mi]的比较。只有在hi - lo == 1是才终止。


      原理
实现

5.6 二分查找--版本C

该版本能够满足语义约定

  • 语义约定


    语义约定
  • 实现

    • 关键:
      要么[lo, mi),要么(mi, hi];hi - lo == 0时终止


      实现

5.7 插值查找 Interpolation Search

  • 原理
    思路:按照个元素的概率分布来确定pivot(即mid)的取值
    关键:秩的比例与值得比例一致

    差值查找

    举个形象的🌰:比如我们事先知道,一本字典中每个字母的所有单词所占的篇幅可能是一定的,比如说50页,那么我们要查一个以b开头的单词时,不用将mid设为字典的重点或者黄金分割点来查,可以将它设为字典中大概2/26的位置。

  • 性能
    最好:O(1)
    最坏:O(N)
    平均:O(lg(lgN))
    缺点:易受到“干扰”


    插值查找效率

问题规模以开方的方式递减,这样的复杂度如何分析?
【字宽折半分析法】
可以把n映射为为计算机中二进制数的字节长度lgN。因此,问题规模以开方的方式减少,相当于字节长度减半。因此相当于是在lgN的基础上问题规模不断减半,因此是lg(lgN)

5.8 关于各查找算法的使用

查找综合对比

6 �无序向量到有序向量:排序

6.1 冒泡排序 Bubble Sort

  • 思路:无序部分在前,有序部分在后。有序部分不断增加,无序部分不断减少。

  • 实现1:扫描N次,每次把扫描区间内最大的元素排在区间最后。
    缺点:必须扫描N次,若区间内大部分元素是有序的话,则实际上没比必要扫描这么多次。即扫描了一定次数后区间就已经有序了。

  • 改进1:扫描的过程中判断扫描区间是否已经sorted,如果是,则不需要进一步扫描,可以及时退出。
    关键:利用一个标志sorted来说实现对扫描区间是否已经有序的判断。

    冒泡排序-改进1

  • 改进2:若区间的只有前一小部分是无序的,后缀一大部分是有序的,那么实际上只需要对前面这一小部分进行扫描交换。
    关键:hi跳过已经有序的后缀部分

    冒泡排序-改进2

  • 性能对比

    • 效率:最好O(N),最坏O(N^2)。不同的算法只在各自的特例中才能有各自的优势。
    • 稳定性Stability:相同元素的相对顺序是否能得到保证。
      由于只有在大小差异的情况下才能有交换,因此是稳定的。
      冒泡排序性能分析

6.2 归并排序 Merge Sort

  • 原理
    利用分治的思想进行:排序 + 归并


    归并排序原理
  • 排序:利用递归知道递归基(即只含有1个元素)

  • 二路归并(2-way merge)

    • 思想


      二路归并思路
    • 实现
      关键:3个指针i, j, k
      i -> 合并向量A中待填充位置
      j -> 子向量B中待比较元素的位置
      k -> 子向量C中待比较元素的位置


      二路归并实现
    • 性能
      最好与最坏:O(NlgN)


      归并排序性能
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容

  • 一、 单项选择题(共71题) 对n个元素的序列进行冒泡排序时,最少的比较次数是( )。A. n ...
    貝影阅读 8,895评论 0 10
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,149评论 0 52
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,225评论 0 2
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,723评论 0 15
  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 1,312评论 0 1