抽象数据类型(接口与实现)

抽象数据类型(从数组到向量)


remove® 删除秩为r的元素并返回
disordered()返回逆序对的个数,本例中(4,3) (7,4) (9,6)
search® 返回不大于r 且秩最大的元素,假设-1号为负无穷

抽象数据类型(模板类)



区间是前闭后开,所以相减就是区间长度

可扩容向量(算法)




问题:是否可以将视频里向量扩容代码中的:

for (int i = 0; i < _size; i++) _elem[i] = oldElem[i];

替代为:

memcpy(_elem, oldElem, _size * sizeof(T));

答:如果T是简单数据类型(int、float、int*等),就没什么区别。如果T是复杂的类,并且重载了等号运算符,那么上面那行代码会调用等号运算符,是“深拷贝”;下面那行代码是“浅拷贝”。

可扩容向量(分摊)

无序向量(基本操作)


T & Vector::operator[](Rank r) { return _elem[r]; } 中的返回值T&是什么意义?
这是类型T的引用,使用它是因为返回值可以作为左值

必须从前往后复制 否则会覆盖中间交叉的部分

无序向量(查找)

无序向量(去重)

无序向量(遍历)

有序向量(唯一化)

有序向量(二分查找版本A)


技巧:统一写成<号,便于阅读
问题:在二分查找的版本A中,既然转向左右需要比较的次数不等,为什么不在进来时先进行e==A[mid]的判断,如果不等,然后再比较如果e(by oytf)
答:一般来说,相等是小概率事件。尽量让大概率事件的比较次数少,这样可以减少平均比较次数。(by yuantailing老师)
嗯,首先是概率。另外,判等的代价与比较差不多,把判等提前,相当于两个方向的成本变成2比2。虽然平衡了,但总体却增加了( by Junhui 老师)

有序向量(Fib查找)


问题:视频中给出的算法使用的是首先用O(lgn)的时间先生成一个fib数列,再继续在每次取得结果,既然在后面的数学计算中知道,这个结果是黄金分割比率为最佳,为什么不直接用mi = lo + (hi - lo)*0.6XXXX(黄金分割率)的直接获得呢?这样岂不是能减少很多的不必要的运算吗?(by Fankenst)
答:首先,两种方法复杂度都是logn,所以需要比较常数。生成fib序列用了logn次整数加法,用黄金分割率用了logn次浮点数乘法,后者慢一点。

其次,问题是离散化的,理论上是按fib数列分割最佳。推出按黄金分割比最佳是在“理想的连续情况”下,不存在。幸好对于任意fib数,黄金分隔法跟fib数列是一样的。

最后,无论是计算fib数列还是算浮点数乘法,这部分占的比例是微乎其微的:如果元素比较操作是复杂操作,那么只需要考虑元素比较次数就可以了;如果是简单操作,那么访存才是瓶颈,而不是计算。(by yuantailing老师)
问题:假设有一长度为6的向量(6不满足某一Fibnacci数-1的形式,而例题中的7是满足的,7=8-1),此时我分别用二分查找和Fibnacci查找分析了成功和失败的查找长度,发现两种分析方法的成功查找长度都是23/6,失败查找长度都是39/7. 所以我想问是不是只有满足我标题那种情况,Fibnacci查找才比二分查找效率要稍微高一点?(by 村上果树 )
答:计算各向量长度的平均成功查找长度、平均失败查找长度,如下表所示。

向量长度等于 fibnacci数 - 1 时,在平均查找长度的意义上,fib 查找的比二分查找(版本 A)更有优势;
向量长度比 fibnacci数 - 1 稍小一点时,因为分得没那么均匀了,因此 fib 查找的平均查找长度的优势没那么明显;
向量长度比 fibnacci数 - 1 稍大一点时,fib 查找会为了那 1 个多余的元素,整体多一层查找,查找长度反而比二分查找大。(by yuantailing老师)
问题:之前while查找,假设到n=hi-lo=fib.get()停止,轴点不应该是fib.prev()吗? 语句mi=lo+fib.get()-1=lo+n-1这么理解对吗?(by madajie9)
答:那么就是说,while终止时,fib.get()即为Fib[n−1],因为当为Fib[n]时循环判断条件hi-lo < fib.get()依然满足,所以继续fib.prev(),最后这个例子出while循环时fib.get()为Fib[n−1]。(by tyj956413282 )

有序向量(二分查找 版本B)


有序向量(二分查找 版本C)

有序向量(插值查找)


log n固然是n的二进制位宽,但它具体代表什么,其实并不重要。这里只需要知道,当log n减到0的时候,问题被解决就够了。

之前的结论是,n不停地折半,需要log n次,问题可以被解决;现在可以利用这个结论,把n=log n带进去,log n不停地折半,需要log (log n)次,问题可以被解决。(by Jason214)
大规模:插值查找
中规模:二分查找
小规模:顺序查找
问题:视频里说,对于大规模的情况下,可先用插值查找转化为中小规模的情况,对于中、小规模的情况而言,可以分别使用二分查找和顺序查找。那么前面所分析,顺序查找时间复杂度O(n),大于二分查找的时间复杂度 O(logn) ,那么有必要在这里对小规模的情况下推荐顺序查找吗?或者说对于小规模数据而言,顺序查找相比二分查找优势何在?谢谢(by tyj956413282)
答:折半查找 O(log n) 的常系数比顺序查找 O(n) 的常系数大,主要原因有:

折半查找里有一些计算
折半查找程序流程的分支比较多
折半查找访存不是顺序的,现代计算机系统结构都对顺序访问有更好的效率(by yuantailing老师)

向量(起泡排序)


算法一旦检测有序就停止执行故复杂度是梯形而不是三角形
反例:前缀r 乱序,后缀有序

该算法复杂度是跳跃的梯形

这是我以前做的,4个bs版本,第1个是最原始的,第2个,即Imp1,是比较常用的,后2个是教材上的代码,对3万个随机数,排序,多次测验,Imp1版本是最快的,写法也比较简明(by 不羁的逆袭)

递归排序(分而治之)

归并排序(二路归并)


将A数组copy给B数组时 视频用的 B[i] = A[i++] 在不同编译器中可能会产生错误效果 我使用的GCC 4.9.2 从右向左编译 那么i=0时 上面的表达式就会变成 B[1] = A[0] 会造成赋值错误 建议写成

for(i =0 ; i <lb;i++)
B[i] = A[i];
(by Binary621081)

归并排序(复杂度)


问题:归并排序的复杂度是O(nlogn),也是稳定的,那涉及到排序统统都用归并排序不就是最好的吗?(by Tony284424 )
答:归并排序同时是Ω(nlogn)的,这意味着对于特殊形式的数据,可能别的算法花费O(n),归并排序仍要Ω(nlogn)。例如数据不是完全打乱的,是分段置乱的,起泡排序可能更快;
归并排序复杂度是O(nlogn),第12章学到快速排序,期望复杂度也是O(nlogn),但常数更小,因此在平均情况下也比归并排序更快;
以上是基于比较的排序。第9章学习桶排序、基数排序是O(n)的。(by yuantailing 老师)
归并排序最坏情况下时间复杂度、最好情况下时间复杂度、平均时间复杂度都是 Ω(nlogn) 。 它的空间复杂度是 O(n) 。

(by 闲人242545)

邓俊辉 数据结构 第二章 向量 笔记相关推荐

  1. 邓俊辉数据结构与算法学习笔记-第四章

    文章目录 栈和队列 a 栈的接口与实现 a1 栈 a2 实例 a3 实现 c c1-1 栈的典型应用 c1-2 进制转换算法 c1-3实现 c2-1括号匹配实例 c2-2 尝试 c2-3 构思 c2- ...

  2. 邓俊辉数据结构与算法学习笔记-第十一章

    文章目录 11.串 11.a ADT 11.b 串匹配 11.b1 串匹配 11.b2 蛮力匹配 11.c KMP算法 11.c1 KMP算法:从记忆力到预知力 11.c2 KMP算法查表 11.c3 ...

  3. 清华大学邓俊辉-数据结构MOOC笔记-树的概念及逻辑表示

    清华大学邓俊辉-数据结构MOOC笔记-树的概念及逻辑表示 有关概念: 与图论略有不同,数据结构中的树:1.需要为每一颗树指定一个特殊的顶点,作为"根"(root),对应rooted ...

  4. 算法与数据结构(邓俊辉)第一章

    算法与数据结构(邓俊辉)第一章 斐波那契数列 斐波那契数列几种方法快慢的对比 斐波那契数列 斐波那契数列几种方法快慢的对比 //头文件 #pragma once class Fib { //Fibon ...

  5. 数据结构(邓俊辉)-[第8章]

    邓俊辉,清华大学计算机系副教授.1993.1995和1997年分别于清华大学计算机系获学士.硕士和博士学位,1997年起在清华大学任教,主要讲授"数据结构"和"计算几何& ...

  6. 邓俊辉数据结构学习-3-栈

    栈的学习 栈的应用场合 逆序输出 输出次序与处理过程颠倒,递归深度和输出长度不易预知 不是很理解 实例:进制转换 大致思路:对于进制转换,我们一般使用的都是长除法,因此要保存每次得到的余数,但是最后算 ...

  7. 邓俊辉数据结构学习心得系列——如何正确衡量一个算法的好坏

    数据结构这门课主要关注如何设计合理的数据结构和算法,来简化时间复杂度和空间复杂度. 想要科学的解决这样一个优化的问题,最核心的思想也是最基础的,就是要量化问题.这也是将数学运用在实际问题中的一个基石. ...

  8. 邓俊辉数据结构学习心得系列——数据结构中所研究的算法

    写在前面的话: 本文只是个人学习邓俊辉老师C++数据结构的整理,包含了很多个人的见解(从内容到材料的组织形式).所整理的内容不保证逻辑性和完整性,仅供参考. 算法的基本性质: 有正确的输入 有正确的输 ...

  9. 邓俊辉 数据结构与算法C++版 第十三章 串 ADT

    邓公数据结构与算法 第十三章 串 ADT 定义和特点 术语 ADT接口实现 模式匹配 问题与需求 算法测试方法 蛮力匹配 构思 蛮力匹配:版本1 蛮力匹配:版本2 蛮力匹配:性能分析 KMP算法 ne ...

  10. 邓俊辉数据结构学习笔记3-二叉树

    二叉树及其表示 树 有根树 从图论的角度看,树等价于连通无环图.因此与一般的图相同,树也由一组项点〈vertex)以及联接与其间的若干条边〈edge) 组成.在计算机科学中,往往还会在此基础上,再指定 ...

最新文章

  1. java gps 距离计算_java计算两个GPS经纬度之间的距离(转)
  2. 线上学python哪家好-广州学Python学校哪家好
  3. 并发基础篇(四): java中线程的状态深入浅出
  4. c语言27除以4,2014计算机等级二级C语言精讲习题及答案 4
  5. 额外篇| Python制作词云
  6. SilverLight显示中文字(一)
  7. .ajax get 写法,原生Ajax写法(GET)
  8. 从运维角度浅谈MySQL数据库优化
  9. 庖丁解牛|图解 MySQL 8.0 优化器查询转换篇
  10. ipad如何与计算机连接网络连接不上,平板电脑网络连接不上怎么办
  11. [SQL入门级] 上篇被移出园子首页,那这篇咱就'薄利多销'
  12. fms5序列号_火枫 FMS-105分体式炉头测评
  13. UA MATH563 概率论的数学基础 中心极限定理1 随机变量序列的收敛
  14. 果然发生了,百度一29 岁程序员因“篡改数据”被抓
  15. Android源码目录结构详解
  16. 【spring】JDK动态代理的使用与源码分析
  17. 【MATLAB数字图像处理】伪彩色增强
  18. 广东第一高中生_广东高中排行榜TOP10,有你的母校吗?
  19. knex.js中文文档
  20. KVM虚拟化之(1):CPU技术

热门文章

  1. 搜索引擎算法研究(一)
  2. win7计算机里桌面菜单没有反应,win7系统桌面任务栏假死无反应的设置办法
  3. Chrome 科研神器!去谷歌学术搜到文章,代码链接就能自动展示
  4. Oracle重建索引
  5. 【WLAN】【基础知识】WIFI那些事儿之DFS
  6. mysql es 父子关系 下级数据查询效率对比
  7. 2021阿里云ECS镜像导入本地VMware虚拟机
  8. php 读取微信对账单,扣丁学堂PHP培训简述PHP如何实现微信对账单处理
  9. 防水穿墙套管在建筑外墙管道需设置柔性连接
  10. Typora自动上传图片