邓俊辉《数据结构》-向量学习笔记
目录
2021.12.7 星期二
向量
数组与向量
简单理解什么是泛化?
理解什么是接口?
向量的ADT操作接口
有序向量
唯一化-去重
有序向量的二分查找
有序向量的fibonacci查找
有序向量的二分查找(改进)
2021.12.8 星期三
起泡排序 Bubblesort
改进
再改进
归并排序 Mergesort
分治策略
二路归并
位图 bitmap
2021.12.20
vector二维数组
初始化
获取长度
赋值
2021.12.7 星期二
向量
在线性结构中,各数据项按照一个线性次序构成一个整体。最基本的线性结构统称为序列,按照逻辑和储存地址的不同分为向量(vector)和列表(list)。逻辑次序-秩(rank)。
数组与向量
在数组中:应该知道什么是前驱、后继、直接前驱、直接后继。
对于向量,向量是数组的一般性推广,使得数组特征更具普遍性。向量是线性数组的抽象和泛化,那么有必要理解一点:
简单理解什么是泛化?
参考文章:https://blog.csdn.net/shrak_12/article/details/110186581
泛化我们在机器学习(深度学习)中能够看到。对某件事情的规律进行的掌握程度,就是泛化能力。做题时如果善于总结做题规律,说明泛化能力好,如果只是一门心思做题没掌握规律,则说明泛化能力差。
泛化与优化:优化(optimization)是调节模型得到最佳性能,而泛化(generalization)是指深度学习得到了模型后,在前所未有的数据上性能的好坏。
理解什么是接口?
参考文章:C++接口的定义与实现_zhanghui962623727的博客-CSDN博客_c++接口
简单的例子:安卓苹果的充电线接到手机上的接口样子是不同的,但是连接电源的接口都是USB接口,当我们想要对不同的设备进行充电的时候,我们不需要在电源上设置各种各样的接口,只需要给个USB接口,使用不同的充电线就行,这样就大概理解了接口的意思。
参考文章中对接口的定义:将内部实现细节封装起来,外部用户用过预留的接口可以使用接口的功能而不需要知晓内部具体细节。
接口的定义:通常在头文件中完成类接口的定义
接口的实现:通常在源文件代码调用来实现接口
向量的ADT操作接口
图片来自C++学习书籍
有序向量
唯一化-去重
低效的方法:从前向后依次比对,发现重复的就删除,为O(n²) 【没有充分利用有序性】
高效的方法:
vector<int>uniquify(){
rank i=0,j=0; //互异的秩while(++j<_size){ //跳过相同者if(_elem[i]!=_elem[j]) _elem[++i]=_elem[j]; //如果两个不同,则向i前移动一位与j相等}//用循环,注意扫描
_size=++i;shrink(); //循环结束之后,对size进行了一个设置,这个向量的规模变成了i停留的地方
return j-i;
}
与低效的方法不同。
有序向量的二分查找
之前讲过的无序向量查找:find(e,lo,hi),进入有序向量之后,有更快的查找方法search(e,lo,hi)
统一接口 返回值是返回的秩
二分查找可以参考“在1到100里猜一个数”
static rank binsearch(T*A,T const&e, rank lo, rank hi){// 在A中从[lo,hi)位置找e
while(lo<hi){int mi=(lo+hi)>1;if(A[mi]<e) lo=mi+1;else if(e<A[mi]) hi=mi;else return mi;
}
return -1; //查找失败
}
有序向量的fibonacci查找
与二分查找不同在于,斐波那契查找的mid取值,二分查找取的值A[λn]中λ=0.5,而斐波那契查找对应的λ=0.618... 也就是黄金分割的一个比例
有序向量的二分查找(改进)
基于左右分支分配不平衡,可以直接解决这个问题
把判断mid是否真正命中包含进右边的判断,终止条件 while(lo+1<hi)
2021.12.8 星期三
有序向量的插值查找
秩的比和数值的比是近似接近的,对于轴点mi可以动态猜测,不需要取1/2 黄金分割比或者λ
起泡排序 Bubblesort
如何将无序向量转化成有序?
需要有很多排序方法,bubblesort、selectionsort、mergesort、heapsort...
不同的排序算法纳入一个统一的标准接口:sort()
改进
复习的时候发现,这里的改进方法和第一章提到的方法其实是一样的,第一章里也引入了bool来避免每次排序都执行n-1次。
对于起泡排序,在第一章节已经提到过用起泡排序证明算法的正确性, 但是这里的起泡排序做了优化,什么样的优化呢?
bubblesort(rank lo, rank hi){ while(!bubble(lo,hi--)); }//一直做扫描交换,直到有序
bubble(rank lo, rank hi){bool sorted = true; //先给sorted有序的标志赋值 truewhile(++lo < hi){if(_elem[lo-1]>_elem[lo]){sorted = false; //说明整体还存在逆序swap(_elem[lo-1],_elem[lo]); //调换,使得局部有序}}return sorted; //循环结束之后,返回判断指标
}
反观之前的起泡排序,二者都是经过不断的扫描在末尾总会加上一个已经确定了的值,但之前的排序是无论前面的部分是否有逆序都进行到底,而这次的起泡排序有一个判断前面是否全部有序的条件,这样在遇到已经完全有序的时候就会及时停止,如下图,(红色部分是有序部分,绿色为含有逆序部分)
再改进
bubblesort(rank lo, rank hi){while(lo<hi=bubble(lo,hi));}
bubble(rank lo, rank hi){
rank last=lo; //last用来储存
while(++lo < hi) //自左向右,逐一检查每个元素,lo会不断累加if(_elem[lo-1]>_elem[lo]){ //比较大小,与之前一样last=lo; //更新最右侧逆序对位置swap(_elem[lo-1],_elem[lo]);}return last;
}
这段代码中的last记录了从左到右依次扫描过程中,最后一个逆序的位置,并且之后lo-1和lo做了交换,下一步的hi就可以变成last,也就是(lo, hi)这一区间段进行排序。
归并排序 Mergesort
起泡排序,最坏的结果都需要O(n²)的时间,是否有一个算法最坏的时间也只需要O(nlogn)?
分治策略
不断划分为左右两个子序列,先不断分解达到最小的递归基,再逐层合并。
void vector<T> mergesort(rank lo, rank hi){if(hi - lo < 2) return; //这里处理递归基,Y也是递归的终止条件int mi = (lo + hi) >> 1; //右移,变成一半mergesort(lo,mi);//前段排序mergesort(mi,hi);//后段排序merge(lo,mi,hi); //归并
}
其中递归的终止条件就是第一个if语句,当前向量长度n=hi-lo=1;
二路归并
二路归并就是上面代码中的merge(lo,mi,hi)这个,是将两个有序的序列合并成一个有序的序列。属于迭代式算法, 每步迭代中,只需要比较两个待归并向量的首元素,谁小取出来放到输出向量的末尾,直到变成非空向量。
位图 bitmap
一个比较另类的数据结构。
把一个整数集合作为一个数据结构:
判断某个整数是否在这个集合里,
2021.12.20
vector二维数组
初始化
//一维动态数组vec含有4个数据,初始化为2
vector<int> vec(4,2) //初始化row*col的动态二维数组,初始化值为0
vector<vector<int>> ans(row,vector<int>(col,0))
获取长度
//已知一个m行n列的矩阵ans
int size_row = ans.size(); //行数
int size_column = ans[0].size(); //列数
赋值
直接ans[][]赋值就好,没啥好写的
邓俊辉《数据结构》-向量学习笔记相关推荐
- 清华大学邓俊辉-数据结构MOOC笔记-树的概念及逻辑表示
清华大学邓俊辉-数据结构MOOC笔记-树的概念及逻辑表示 有关概念: 与图论略有不同,数据结构中的树:1.需要为每一颗树指定一个特殊的顶点,作为"根"(root),对应rooted ...
- 邓俊辉数据结构学习-3-栈
栈的学习 栈的应用场合 逆序输出 输出次序与处理过程颠倒,递归深度和输出长度不易预知 不是很理解 实例:进制转换 大致思路:对于进制转换,我们一般使用的都是长除法,因此要保存每次得到的余数,但是最后算 ...
- 邓俊辉数据结构学习心得系列——如何正确衡量一个算法的好坏
数据结构这门课主要关注如何设计合理的数据结构和算法,来简化时间复杂度和空间复杂度. 想要科学的解决这样一个优化的问题,最核心的思想也是最基础的,就是要量化问题.这也是将数学运用在实际问题中的一个基石. ...
- 邓俊辉数据结构学习心得系列——数据结构中所研究的算法
写在前面的话: 本文只是个人学习邓俊辉老师C++数据结构的整理,包含了很多个人的见解(从内容到材料的组织形式).所整理的内容不保证逻辑性和完整性,仅供参考. 算法的基本性质: 有正确的输入 有正确的输 ...
- 邓俊辉数据结构学习笔记3-二叉树
二叉树及其表示 树 有根树 从图论的角度看,树等价于连通无环图.因此与一般的图相同,树也由一组项点〈vertex)以及联接与其间的若干条边〈edge) 组成.在计算机科学中,往往还会在此基础上,再指定 ...
- 邓俊辉数据结构学习笔记2
列表 typedef int Rank; //秩 #define ListNodePosi(T) ListNode<T>* //列表节点位置template<typename T&g ...
- 邓俊辉数据结构与算法学习笔记-第四章
文章目录 栈和队列 a 栈的接口与实现 a1 栈 a2 实例 a3 实现 c c1-1 栈的典型应用 c1-2 进制转换算法 c1-3实现 c2-1括号匹配实例 c2-2 尝试 c2-3 构思 c2- ...
- 清华邓俊辉数据结构学习笔记(4) - 二叉搜索树、高级搜索树
第七章 二叉搜索树 (a)概述 循关键码访问:数据项之间,依照各自的关键码彼此区分(call-by-key),条件是关键码之间支持大小比较与相等比对,数据集合中的数据项统一地表示和实现为词条entry ...
- 邓俊辉数据结构学习笔记1
起泡排序算法 void bubblesort1A(int A[], int n) //起泡排序算法(版本1A):0 <= n {int cmp = 0, swp = 0;bool sorted ...
- 清华邓俊辉数据结构学习笔记(3) - 二叉树、图
第五章 二叉树 (a)树 树能够结合向量的优点(search)和列表的优点(insert.remove),构成List< List >. 有根树 树是特殊的图 T = (V, E),节点数 ...
最新文章
- Dynamics CRM2016 Web API之创建记录
- python扫雷游戏_python实现扫雷小游戏
- CVPR 2021大奖出炉!何恺明获最佳论文提名,第一届Thomas S. Huang 纪念奖颁发
- java pack unicode,汉字和Unicode码(utf-8)之间的转换(Pack/Unpack)
- python笔记6--编码
- centos7.3安装elasticsearch-head
- 前端基础——day1
- 操作系统(三十二)内存的基础常识
- Java-switch选择结构
- css上传图片中等待不可点击效果
- JS中的六大数据类型 (笔记0)
- 201621123031 《Java程序设计》第13周学习总结
- 20145122 《Java程序设计》第5周学习总结
- 13.Serving Frontend Files
- Spring Boot 启动参数设置详解
- html5鼠标悬停遮罩,js实现鼠标移动到图片产生遮罩效果
- NET FRAME WORK 3.5下载地址
- 音视频技术 数字电视发展应用
- 魔兽怀旧服怎么找不到服务器,魔兽世界怀旧服世界服务器无法连接怎么办
- tolua错误大全-Chinar出品-几乎可为新手解决所有报错情景
热门文章
- 怎么用计算机计算性别的公式,测男女的计算公式测了下挺准的
- Pytorch框架学习记录10——线性层
- Exp1 PC平台逆向破解 20164302 王一帆
- Hexo 搭建博客提交百度 sitemap 抓取失败
- 【博学谷学习记录】超强总结,用心分享 | 【Lunux】Manjaro手动升级icu依赖库安装MySQL以及Navicat
- 微信扫描自定义二维码关注公众号
- 为什么不推荐大家去外包公司
- Java_IOl流_缓冲流_转换流
- [Zer0pts2020]Can you guess it?
- 阿里云域名配置以及https证书(ssl证书)配置