数据结构
1.说明是数据结构?
数据存储在哪里呢,这里就要涉及到寄存器之类的东西了,本文不做延伸,可以参考这里简单看下(存储数据的地址:http://www.cnblogs.com/xiohao/p/4296088.html),以后我可能会进行总结,这个链接严格来说并不深入,感觉以前上学那会儿上单片机课本上的那个比较详细,这种东西要是想详细了解还是翻书比较好。
2.常见的数据结构
不同的数据结构由于存储方式的不同,会有不同的操作方式。
数组(Array)
最简单的数据结构类型是一维数组。例如,索引为0到9的32位整数数组,可作为在内存地址2000,2004,2008,...2036中,存储10个变量,因此索引为i的元素即在内存中的2000+4×i地址。数组第一个元素的内存地址称为第一地址或基础地址。
利用元素的索引(index)可以计算出该元素对应的存储地址。
(通过索引来操作数据)
堆栈(Stack)
堆栈(英语:stack),也可直接称栈(港澳台作堆叠),在计算机科学中,是一种特殊的串列形式的数据结构,它的特殊之处在于只能允许在链接串列或阵列的一端(称为堆叠顶端指标,英语:top)进行加入数据(英语:push)和输出数据(英语:pop)的运算。另外栈也可以用一维数组或连结串列的形式来完成。堆叠的另外一个相对的操作方式称为伫列。
由于堆叠数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作。
(只能对栈顶进行操作)
队列(Queue)
队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。
(可以想象下你去买东西然后要排队,不能插队新来的人只能从后面开始排,前面的人排到了就走了退出队列。线性表(Linear List)是由n(n≥0)个数据元素(结点)a[0],a[1],a[2]…,a[n-1]组成的有限序列。)
链表(Linked List)
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。
(非线性存储数据的线性表,与队列对立。)
树(Tree)
在计算机科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
图(Graph)
在数学上,一个图(Graph)是表示物件与物件之间的关系的方法,是图论的基本研究对象。一个图看起来是由一些小圆点(称为顶点或结点)和连结这些圆点的直线或曲线(称为边)组成的。
图(Graph)是由顶点的有穷非空集合和顶点之间的边的集合组成。
参考这两个链接
http://www.jianshu.com/p/6cace353141d
http://www.cnblogs.com/w-wanglei/p/figure.html
堆(Heap)
堆(英语:Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权。堆即为解决此类问题设计的一种数据结构。
散列表(Hash)
散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。
一个通俗的例子是,为了查找电话簿中某人的号码,可以创建一个按照人名首字母顺序排列的表(即建立人名到首字母的一个函数关系),在首字母为W的表中查找“王”姓的电话号码,显然比直接查找就要快得多。这里使用人名作为关键字,“取首字母”是这个例子中散列函数的函数法则,存放首字母的表对应散列表。关键字和函数法则理论上可以任意确定。
通过以上对应wiki,可以对数据结构有一定的理解。下面我们来看看数据结构的具体使用场景。
3.数据结构与算法
提到数据结构,就必定会提到算法。
在我看来数据结构与算法存在的根本目的,应该就是:数据种类时多种多样的,因此我们需要选择不同的存储结构(用于存数据),与算法(用于操作数据),以便能对高效地数据进行操作,这只是个人理解,不能尽信。
搜索资料中发现一个相关资料,是清华大学数据结构(C++语言版)课程。
课程地址:https://dsa.cs.tsinghua.edu.cn/~deng/ds/dsacpp/
这个网站,可以动态地观看多种数据结构的简单使用,该网站支持中文模式。
http://zh.visualgo.net/zh
其实学习数据结构还是需要通过书籍才能全面地学习。
参考链接:
https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84
网友评论