(前言)好i好构思线 面 空间
(没那么多时间写cpp源码当然数据结构和cpp也没关系,后面会补全cpp源码)只要你有足够的编码能力你就随便将你想要的一切让计算机表达出来。所有语言只不过是一种表达方式罢了其实并没什么不同或是编译,或是解释,这不做探讨,只是想表达所有everything 都会变成机械语言,物理地址。所以理解数据结构概念很重要,不得不说一个很冷的我的理解,狗来都能敲代码。更重要的是框架,对各种框架理解,这些很需要经验,或许数据结构和算法也是需要经验,欧不,我的理解是数据结构和算法是可以变通,会更有灵性。我自己胡言乱语。
1.数据结构的概念
数据结构顾名思义用来储存数据的结构看一下图。其实所谓就是将这一切一切的结点按照某些规则联系起来。当然其实你学到avl树,红黑树,b+树你就会觉得你何尝不能自己写一些成员到结点里面去呢,然后你自己去制定一些规则去连接题目,当然一切一切都涉及为了更好,更快,更强了。
如果达不到预期的效果,那不就等于加了一些渣滓。很简单的例子顺序表 你依靠下表去索引位置,当然你可以在找它的时候一下子就找到它,但是增删在中间你就会很烦恼,当然链表去增删很简单,只要对结点里面地址做一些小小的更改就行了,但是查找是很麻烦,在有非线性的树,图,虽然减少了时间复杂度,但是也是引进了空间复杂度。
在人类现有定义的有线性数据结构和非线性的。
1.线性数据结构
所谓线性表就是将所有结点连接起来就像一条线一样,每个结点都只有一个索引去往下一个结点。
1.顺序表
这个很好理解,常见的数组,就是顺序表,但是我们int a【10】;这样定义一个数组始终是静态,不能去动态管理内存。
像这样去手动写一个可以扩容的线性表, 这是一些接口去增删改查这个表,目前还未完善。后续放源码。当然可以看出其实用T*datas;这样去从堆区上开辟一些空间。奥,这些都是废话,没必要为了这些去说什么。就像当你写一个容器时,你就得考虑这个容器最大容量,和容器内的元素有几个。
当然这不得不提我在指针篇所提及的
int**arrays;
arrays=new int*【100】;(无关紧要)
for(int i=0;i<100;++i)
{
arrays【i】=new int【100】;
};
当然你可以看出了了这是一个二维数组,我觉得你对映射 (键值对)应该有个概念
或许看看后面的哈希你就知道什么是键值对了 你的空间想象能力可以完全再大一些。
你去想着线 面 空间,这非常重要,
或许举个例子当然它可以不是整数型它可以是任何东西,最重要的你应该发现这是一个n维度的数组。
2.链表
关于这个话题我想只有一句话用地址来串联的一个线性表
欧这可能会涉及到一个叫做递推的东西(当然我都理解是在只有)
omg 有一个写成了listnode<int>,但是这个无关紧要后续我会发源码的,可以看出我们在结点上加了一些东西T val 模板类,你可以在里面加任何东西这是我最想说的,然后就是他往下一个结点的地址。这并不难理解。
3.栈 队列
这两个其实就是一个数组但是夹带一些特性
栈:先进后出。
队列:先进先出。
看看图片。
1栈就像一杯有底部水桶这很好理解 先进去的水最后倒出来。(当然你不需要转牛角尖)
2队列就是一个没底部的水桶 先进去的水会从底部出来。
但是两者中间的东西我们无法掌控。无法得知。
4。哈希
哈希很特别我觉得非常特别
去理解哈希
桶排序
哦,这非常不错的例子map<int,vector<int>>
每一个序号映射一个桶(或许你第一次件会被桶吓怕)这就是一个数组
将10000个数放入
emmm‘,你可以有任意n个桶
做一些特别的规则
例如大于x小于y进入第m个桶
后面我会详细讲一下10大排序
任何所有数据一个不落放入这n个桶各自排序
在从一个桶开始到倒出来开始。
重点来了 其实·就是一个简单的分治排序
将m个树分成 n个数组
各自排序再将所有数组串联,或许你了解其他排序就更更好理解了。
所以我想说哈希
就是 x -》y
映射至于x,y有啥规则也由你制定。
2.非线性
1.树
这会变得复杂一点点,但是就是一句话你这结点有n给下一个结点
树会有一个根结点,这是一颗二叉树,顾名思义就是每个结点都有俩个下一个结点。
left 和 right 这个命名倒是无所谓,这只是链式结构有点一棵树
当然上文提到的 vector<vector<.......<int>.......>你好好去理解一下这个,我觉得对你的帮助很大
从线性到非线性。
2.图
所谓图就是各个节点都可能有连接
权就是边上可能有点数值
of course 也有方向这个这本不需要解释太多
map<map<int,int>,int>;骚年理解一下吧。
请各位大佬多多指点错位,或许去吧,或许你可以研究出你自己的数据结构。(我会慢慢完善我都博客会慢慢把cpp源码补齐,然后出一个十大排序的理解的)。