数据结构定义
数据结构是没有统一定义的。
看不懂没关系,刚开始学,等到学完再回过来头看就好啦。
数据结构和算法是经常挨在一起的东西。
例1:如何在书架上摆放图书
![](https://img-blog.csdnimg.cn/7b4cd2ebcaa84faeb23613508b299777.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_19,color_FFFFFF,t_70,g_se,x_16)
这个问题问的很不科学,因为没有说给的书架是什么样子的,书架可以是:
![](https://img-blog.csdnimg.cn/760ceb1ff09b4bea802547a81ce2c097.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/e4fc8307a2c7447f8b1aef8461db67e1.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
所以,当我问你一个数据怎么组织的时候,就是跟这个数据的规模有关系的。不一样的规模的问题,它处理起来的难度就是不一样的。
![](https://img-blog.csdnimg.cn/8b8fb674f52848ddba3a59824235142b.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/fd41d1aaf38a43c5b261e8384f6ee249.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/111e67e08c4a435d9ab707b4a3711236.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
方法2插入一本新书:《阿Q正传》,那就要在a开头的找到位置,后面的书往后移,如果书很多,这还是很难。
![](https://img-blog.csdnimg.cn/abc2259867fb43eb9b52850f4b55e4fd.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
这个例子想说明的是:
解决问题方法的效率,跟数据的组织方式有关
![](https://img-blog.csdnimg.cn/a33a4a9733a44cad816b77698fb9575d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
例2:写程序实现一个函数PrintN,使得传入一个正整数为N的参数后,能顺序打印从1到N的全部正整数
![](https://img-blog.csdnimg.cn/220dc5f33b27484e95022db72594e6ca.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
将上面的两种实现方式,写出来跑一跑,看一下:
![](https://img-blog.csdnimg.cn/81e8f0b2dee84a65a8dab6f44c329823.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
我们发现,循环实现需要等待一会就会执行完成,而递归实现直接就不走,因为递归对计算机来说占用的内存空间是很大的,这就告诉我们:
解决问题方法的效率,跟空间的利用效率有关
![](https://img-blog.csdnimg.cn/407c04346f754c46b79a094787e15f4a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/44aed7f634564953b3770a291b19bf2e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
例3:写程序计算给定多项式在给定点x处的值
![](https://img-blog.csdnimg.cn/f1b55bfca3094595b6e831b4fddc3c7a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
在程序员圈子里,写第一种方法是会被鄙视的,因为第一个函数慢很多。下面可以写代码测试一下:
![](https://img-blog.csdnimg.cn/01140700f3e649cdb4726de686123787.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
在上面的代码中,求duration的时候除了一个常数(CLK_TCK),就得到了一个以秒为单位的duration。
![](https://img-blog.csdnimg.cn/db926539eb0a4963ae83509f9b14f75a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/bd29080e7c3843cca874968bde0c72e0.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
上面的不对,因为两个ticks都是0,所以duration也是0,那是因为这两个函数跑的太快了,运行的时间可能都不到一个tick那怎么办呢?
![](https://img-blog.csdnimg.cn/a5cf34ecd5b147bb91a7370d3c0f039f.png)
![](https://img-blog.csdnimg.cn/eb9df06691a04ee8820554be7c8bdd45.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
这个时候就有值出来了,这两组的数据的相对大小,应该都是差了一个数量级的样子。
解决问题方法的效率,还跟算法的巧妙程度是有关系的
![](https://img-blog.csdnimg.cn/cb24dba930ce4a56b636a95fad4c6089.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/eee09388dd24407fa66f732e2879aa86.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
所以到底什么是数据结构
![](https://img-blog.csdnimg.cn/9a4cdaa9eb574767826f4ec5d111e2bd.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
逻辑结构(1对1、1对多等)
物理存储结构(数组存放、链表存放)
抽象数据类型
![](https://img-blog.csdnimg.cn/4b58896b11d64b37a2bfa121e33ec059.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
例4:“矩阵” 的抽象数据类型定义
![](https://img-blog.csdnimg.cn/c0d23be278b841eba7d9994a449a655a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
对于上面这些,进行了抽象处理,为了的就是防止转换数据类型什么的时候出错。
![](https://img-blog.csdnimg.cn/97c9f20190ea41b3af3fec71bbad5ba2.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/f1b8da5b08ca4a5f88feee6dd8ec74c8.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)