算法解读:数据结构

什么是数据结构?

大量数据的有效管理机制。描述计算机算法的时候使用的数据结构有很多种:

  数组:连续排列数据的数据结构,数据以线性无间隙地排列
  链表:数据按照顺序排列的数据结构,链表可以管理线性排列的数据,也可以远距离存放
  栈:类似于桌子上堆书一样来管理数据的数据结构,栈是一种与数据输入顺序相反,逆序输出的数据管理方式
  队列:如同在超市收银台结账一样,先来的顾客先付款,队列是数据输出顺序与输入顺序一致的数据管理方式
  树:如同树枝可以分出两个、三个甚至多个树枝,而每个分出来的树枝还可以再分出两个、三个甚至多个树枝一样

在栈管理数据中,数据输入操作叫做入栈(Push),数据输出操作叫做出栈(Pop). 栈是有最后输入的数据最先输出这种特点的管理方法,我们称为后进先出(LIFO--Late In First Out), 或者先进后出(FILO).

队列

刚刚栈是先进后出,或者后进先出,那么队列则是先进先出(FIFO--First In First Out),或者是后进后出(LILO--Late In Late Out)的数据结构.

链表

链表的数据长度没有限制,且物理上可以不连续。

一维数组根据数据无间隙的线性排列来管理数据的前后关系,也就是说数组是把数据放入相邻的盒子中,这样就会知道顺序的数据结构。数组的各元素比较松散时,数组地址空间中数据的顺序就无法得知了,这就意味着,数组中各个元素必须紧密地放在一起不能远离。

单向链表跟数据存放的位置无关。即使移动数据的存储位置,也能以正确的顺序管理数据。

在管理有多少个有效数据上,数组根据变量来管理数据的个数,链表是”没有指向下一个数据的指针“时到达链的尾部。

单向链表

链表中,从前向后由有方向性的链连接,将有一定顺序的数据连接起来的方法叫做单向链表。

单向链表有两种要素:数据(结点中保存的整数、浮点数和字符串等由链表管理的值)和指向下一结点的指针(后继指针,指出下一个元素的物理地址)。

购物顺序链表表示:

从家里-->水果店买水果-->去肉店买肉-->去鱼店买鱼-->去点心铺买点心:这里不考虑回家的情况,即不考虑循环链表的存在

双向链表

在链表中从前向后和从后向前两个方向都有链,并将有顺序的数据连接起来的方式叫做双向链表。

双向链表有以下三种要素:数据,指向前一节点的指针,指向后一节点的指针

双向链表中还需要指出头结点和尾结点的指针,且双向链表中的每个元素由数据和指向前后结点的指针构成。

从前向后遍历数据的时候,从头指针指出的元素开始,使用后继指针,得到下一个元素、下下个元素,依次遍历。

从后向前遍历数据的时候,从尾指针指出的元素开始,使用前驱指针,得到前一个元素、前前个元素,依次遍历。

查找元素

查找按顺序排列的数据的第N个元素时,数组可以根据元素号直接找到元素。链表必须从头节点开始遍历直到第N个元素为止,比如同样查找第5个元素,数组可以直接通过array[4]定位到该元素,而链表的查找顺序如下:

  查找第1个结点
  从第1个结点查到后继的第2个结点
  从第2个结点查到后继的第3个结点
  从第3个结点查到后继的第4个结点
  从第4个结点查到后继的第5个结点

没有以上5个步骤就无法查找到第5个结点。依次类推,如果查找第10000个结点....因此,在查找第N个元素这种情况,数组比链表更有效率。

插入删除数据

在顺序排列的数据列中的特定位置插入新的数据时,数组要把插入位置后面的所有元素都向后移动,而链表只需要断开数据位置前后的链,将新的数据连接到链表中就可以了。

删除数据也一样,对于数组执行删除数据的操作,删除数据后面的所有数据都要向前移动,而链表,无论删除的数据后面有多少个数据,只需要断开删除数据的链接,然后把前后两个结点直接连接起来就可以了。

因此,删除和插入操作中,链表的效率较高。

二叉树

单链表是使用”指向后继结点的指针“将数据连接起来的管理顺序的数据结构。二叉树有两个指向后继指针的单链表。

二叉树中,构成要素称为结点。二叉树是由一个父结点和两个子结点。

二叉树中并不一定都有左右子节点,只有左结点或者只有右结点也是允许的,但是有三个及以上的子节点存在是不允许的。

没有父结点的结点称为”根结点“,没有子结点的结点称为”叶结点“.

堆中,父结点的值不得比子结点的值大,或者,父结点的值不得比子结点的值小。

堆适用于求最小值的数据结构。

可以将上述堆改造成数组:

哈希表

(被称为根数组并且元素数为N的数组) + (根数组的元素作为链表的头指针) = 哈希表

哈希表管理数据首先要根数组元素的值决定放入在哪个位置,得到这个值的过程叫做哈希函数。

哈希函数根据输入元素的值,由函数计算得到一个"0 ~ (N-1)"(数组元素个数)范围的值,这个值叫哈希值。根据哈希值和数组元素的编号,能够决定元素在根数组中的位置。

从哈希表管理的数据中查找特定数据的时候,首先要求出哈希值,然后查到对象在表中的位置,之后在这个组中安顺序搜索直到查找到目标元素。

哈希函数-->简单来说,就是返回将输入数与哈希表元素数作商求余的值。

根据上图,假设需要在哈希值为2中查找元素"可乐",那么,利用哈希函数,可以定位到根数组[2]指向的链表中查找是否存在"可乐"元素。

图示表现两个以上项目关系的方法,图中要表达的项目叫做结点,将项目连接起来的线叫做边。图,则是利用“结点”和“边”表示数据连接关系的数据结构。

图论-->专门研究边的集合和点的集合构成的图的性质的学问。

时间: 2024-11-08 20:35:58

算法解读:数据结构的相关文章

浅谈算法和数据结构

: 一 栈和队列 http://www.cnblogs.com/yangecnu/p/Introduction-Stack-and-Queue.html 最近晚上在家里看Algorithems,4th Edition,我买的英文版,觉得这本书写的比较浅显易懂,而且“图码并茂”,趁着这次机会打算好好学习做做笔记,这样也会印象深刻,这也是写这一系列文章的原因.另外普林斯顿大学在Coursera 上也有这本书同步的公开课,还有另外一门算法分析课,这门课程的作者也是这本书的作者,两门课都挺不错的. 计算

程序语言的奥妙:算法解读 ——读书笔记

算法(Algorithm) 是利用计算机解决问题的处理步骤. 算法是古老的智慧.如<孙子兵法>,是打胜仗的算法. 算法是古老智慧的结晶,是程序的范本. 学习算法才能编写出高质量的程序. 懂得了算法,游戏水平会更高. 比如下棋,如果懂得棋谱,就不需要每次考虑"寻找最好的一步棋",按照棋谱 就可以走出最好的几步棋.棋谱是先人们智慧的结果,因此掌握多种棋谱的人更 容易在对弈中获得胜利. 算法的学习类似学习游戏攻略. 算法是编写好程序的"棋谱". 算法必须满足&

【算法与数据结构】哈希表-链地址法

哈希表的链地址法来解决冲突问题 将所有关键字为同义词的记录存储在同一个线性链表中,假设某哈希函数产生的哈希地址在区间[0, m - 1]上,则设立一个至振兴向量 Chain  ChainHash[m]; 数据结构 //链表结点 typedef struct _tagNode { int data; //元素值(关键字) struct _tagNode* next; //下一个结点 }Node, *PNode; //哈希表结点 typedef struct _tagHashTable { //这里

《 常见算法与数据结构》平衡查找树(2)——红黑树(附动画)

本系列文章主要介绍常用的算法和数据结构的知识,记录的是<Algorithms I/II>课程的内容,采用的是"算法(第4版)"这本红宝书作为学习教材的,语言是java.这本书的名气我不用多说吧?豆瓣评分9.4,我自己也认为是极好的学习算法的书籍. 通过这系列文章,可以加深对数据结构和基本算法的理解(个人认为比学校讲的清晰多了),并加深对java的理解. 红黑树介绍 红黑树是一种简单的实现2-3树的数据结构,它方便的把我们之前实现的二叉搜索树改造成了一棵2-3树.它的核心思想

如何学好算法和数据结构之我见——51CTO名家访谈实录

最近受邀参加"51CTO名家访谈"就算法与数据结构话题论道做答,希望这些问题能够解答各位读者朋友的心中疑惑. 活动网址如下: http://book.51cto.com/act/exp/zuofei 下面是活动中Q&A环节我的一些作答,希望可以作为正在学习算法的朋友们的一些经验参考. 算法到底是什么? 非形式地说,算法是为实现某个任务而构造的简单指令集.以日常用语来说,算法又称为 过程或者方法.算法在数学中也起着非常重要的作用.古代数学文献中就包含有执行各种各样计算任务的算法描

【转载】浅谈算法和数据结构: 一 栈和队列

作者:yangecnu(yangecnu's Blog on 博客园) 出处:http://www.cnblogs.com/yangecnu/ 最近晚上在家里看Algorithms,4th Edition,我买的英文版,觉得这本书写的比较浅显易懂,而且“图码并茂”,趁着这次机会打算好好学习做做笔记,这样也会印象深刻,这也是写这一系列文章的原因.另外普林斯顿大学在Coursera 上也有这本书同步的公开课,还有另外一门算法分析课,这门课程的作者也是这本书的作者,两门课都挺不错的. 计算机程序离不开

算法与数据结构基础1:动态数组

恶补算法与数据结构,从很基础的开始,先看动态数组的实现. // array.h #include <iostream> #include <cstring> #include <cstdlib> using namespace std; class Array { public: // ************************************************************************** // 类的四大函数:构造函数.拷贝构

浅谈算法和数据结构: 一 栈和队列

最近晚上在家里看Algorithems,4th Edition,我买的英文版,觉得这本书写的比较浅显易懂,而且"图码并茂",趁着这次机会打算好好学习做做笔记,这样也会印象深刻,这也是写这一系列文章的原因.另外普林斯顿大学在Coursera 上也有这本书同步的公开课,还有另外一门算法分析课,这门课程的作者也是这本书的作者,两门课都挺不错的. 计算机程序离不开算法和数据结构,本文简单介绍栈(Stack)和队列(Queue)的实现,.NET中与之相关的数据结构,典型应用等,希望能加深自己对这

视图动画学习算法和数据结构(二)(&lt;Garry进阶(四)&gt;)

转载请注明: 接视图动画学习算法和数据结构(不定期更新)() 快速排序(QuickSort) 动画演示: java代码: public class QuickSort { private int array[]; private int length; public void sort(int[] inputArr) { if (inputArr == null || inputArr.length == 0) { return; } this.array = inputArr; length

算法与数据结构基础10:C++实现——拓扑排序

一 定义 拓扑排序是对有向无环图(Directed Acyclic Graph简称DAG)顶点的一种排序, 它使得如果存在一条从顶点A到顶点B的路径,那么在排序中B出现在A的后面. 二 先决条件 能够进行拓扑排序图有两个先决条件:有向.无环,即有向无环图. 三 偏序全序 连通图:任意两点之间都存在至少一条边 偏序:非连通图(有向无环图满足偏序关系) 全序:单连通图 四 结果唯一性 对于仅满足偏序关系的有向无环图中,因为有两个点之间的关系是不确定的,所以导致排序的结果是不唯一的. 满足全序关系的有