《数据结构与算法》知识点(一)

第一章 绪论

基本概念和术语:

1.数据、数据元素、数据项和数据类型

数据:所有能被输入到计算机中,且能被计算机处理的符号的集合。是计算机操作的对象的总称。

数据元素:数据(集合)中的一个“个体”,数据及结构中讨论的基本单位

数据项:数据的不可分割的最小单位。一个数据元素可由若干个数据项组成。

数据类型:在一种程序设计语言中,变量所具有的数据种类。整型、浮点型、字符型等等

2.数据结构——逻辑结构和存储结构

逻辑结构:数据之间的相互关系。

集合 :结构中的数据元素除了同属于一种类型外,别无其它关系。

线性结构 :数据元素之间一对一的关系

树形结构 :数据元素之间一对多的关系

图状结构或网状结构 :结构中的数据元素之间存在多对多的关系

在数据结构中,从逻辑上可以将其分为线性结构和非线性结构

物理结构/存储结构:数据在计算机中的表示。物理结构是描述数据具体在内存中的存储(如:顺序结构、链式结构、索引结构、哈希结构)等

数据结构的基本操作的设置的最重要的准则是:实现应用程序与存储结构的独立。实现应用程序是“逻辑结构”,存储的是“物理结构”。逻辑结构主要是对该结构操作的设定,物理结构是描述数据具体在内存中的存储(如:顺序结构、链式结构、索引结构、希哈结构)等。

3.数据类型和抽象数据类型

数据类型:在一种程序设计语言中,变量所具有的数据种类。整型、浮点型、字符型等

抽象数据类型:一个数学模型以及定义在该模型上的一组操作。

抽象数据类型可以使我们更容易描述现实世界。例:用线性表描述学生成绩表,用树或图描述遗传关系。

关键:使用它的人可以只关心它的逻辑特征,不需要了解它的存储方式。定义它的人同样不必要关心它如何存储。

例:线性表这样的抽象数据类型,其数学模型是:数据元素的集合,该集合内的元素有这样的关系:除第一个和最后一个外,每个元素有唯一的前趋和唯一的后继。可以有这样一些操作:插入一个元素、删除一个元素等。

4.抽象数据类型的表示与实现

详细

定义格式:

ADT 抽象数据类型名{

数据对象:<数据对象的定义>

数据关系:<数据关系的定义>

基本操作:<基本操作的定义>

}ADT 抽象数据类型名

例:线性表的表示

名称线性表

数据对象D={ai| ai(-ElemSet,i=1,2,...,n,n>=0}任意数据元素的集合

数据关系R1={<ai-1,ai>| ai-1,ai(- D,i=2,...,n}除第一个和最后一个外,每个元素有唯一的直接前趋和唯一的直接后继

基本操作ListInsert(&L,i,e)L为线性表,i为位置,e为数据元素。

算法与算法分析:

1、算法的定义及特性

算法五个特性: 有穷性、确定性、可行性、输入、输出

算法设计要求:正确性、可读性、健壮性、高效率与低存储量需求。(好的算法)

2、评价算法优劣的基本标准

算法的描述有伪程序、流程图、N-S结构图等。E-R图是实体联系模型,不是程序的描述方式。

设计算法在执行时间时需要考虑:算法选用的规模、问题的规模

3、算法的时间复杂度

时间复杂度:算法的执行时间与原操作执行次数之和成正比。时间复杂度有小到大:O(1)、O(logn)、O(n)、O(nlogn)、O(n2)、O(n3)。幂次时间复杂度有小到大O(2n)、O(n!)、O(nn)

4、算法的空间复杂度

空间复杂度:若输入数据所占空间只取决于问题本身,和算法无关,则只需要分析除输入和程序之外的辅助变量所占额外空间。

(1)一个程序不一定满足有穷性。例操作系统,只要整个系统不遭破坏,它将永远不会停止,即使没有作业需要处理,它仍处于动态等待中。因此,操作系统不是一个算法。

(2)程序中的指令必须是机器可执行的,而算法中的指令则无此限制。算法代表了对问题的解,而程序则是算法在计算机上的特定的实现。

(3)一个算法若用程序设计语言来描述,则它就是一个程序。

第二章 线性表

线性表的定义及特点:

1、存在唯一的第一个元素;(这一点决定了图不是线性表)

2、存在唯一的最后一个元素;

3、除第一个元素外,其它均只有一个前驱(这一点决定了树不是线性表)

4、除最后一个元素外,其它均只有一个后继。

线性表的顺序表示和实现

1、线性表的顺序存储表示

线性表的顺序存储结构:把线性表的结点按逻辑顺序依次存放在一组地址连续的存储单元里。用这种方法存储的线性表简称顺序表。是一种随机存取的存储结构。顺序存储指内存地址是一块的,随机存取指访问时可以按下标随机访问,存储和存取是不一样的。如果是存储,则是指按顺序的,如果是存取,则是可以随机的,可以利用元素下标进行访问。

数组比线性表速度更快的是:原地逆序、返回中间节点、选择随机节点。

便于线性表的构造和任意元素的访问

插入:插入新结点,之后结点后移。平均时间复杂度:O(n)

删除:删除节点,之后结点前移。平均时间复杂度:O(n)

2、顺序表中基本操作的实现

顺序表:他是在计算机内存中以数组形式保存的线性表。使用一组地址连续的存储单元依次存储数据元素的线性结构。

线性表的链式表示和实现

线性链表:用一组任意的存储单元来依次存放线性表的结点,这组存储单元即可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任意位置上的。

因此,链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址。data域是数据域,用来存放结点的值。next是指针域(亦称链域),用来存放结点的直接后继的地址(或位置)。不需要事先估计存储空间大小。

1、单链表的定义与表示

单链表:是一种链式存储的结构。用一组地址任意的存储单元存放线性表中的数据元素。(存储地址空间不需要是连续的)

单链表中每个结点的存储地址是存放在其前趋结点next域中,而开始结点无前趋,故应设头指针head指向开始结点。同时,由于最后一个结点无后继,故结点的指针域为空,即NULL。头插法建表(逆序)、尾插法建表(顺序)。增加头结点的目的是算法实现上的方便,但增大了内存开销。

查找:只能从链表的头指针出发,顺链域next逐个结点往下搜索,直到搜索到第i个结点为止。因此,链表不是随机存取结构。

插入:先找到表的第i-1的存储位置,然后插入。新结点先连后继,再连前驱。

删除:首先找到ai-1的存储位置p。然后令p–>next指向ai的直接后继结点,即把ai从链上摘下。最后释放结点ai的空间.r=p->next;p->next=r->next;delete r。

判断一个单向链表中是否存在环的最佳方法是快慢指针。

2、单链表基本操作的实现

3、循环链表

循环链表:是一种头尾相接的链表。其特点是无须增加存储量,仅对表的链接方式稍作改变,即可使得表处理更加方便灵活。

在单链表中,将终端结点的指针域NULL改为指向表头结点的或开始结点,就得到了单链形式的循环链表,并简单称为单循环链表。由于循环链表中没有NULL指针,故涉及遍历操作时,其终止条件就不再像非循环链表那样判断p或p—>next是否为空,而是判断它们是否等于某一指定指针,如头指针或尾指针等。

4、双向链表

双向链表:在单链表的每个结点里再增加一个指向其直接前趋的指针域prior。这样就形成的链表中有两个方向不同的链。双链表一般由头指针唯一确定的,将头结点和尾结点链接起来构成循环链表,并称之为双向链表。设指针p指向某一结点,则双向链表结构的对称性可用下式描述:p—>prior—>next=p=p—>next—>prior。从两个方向搜索双链表,比从一个方向搜索双链表的方差要小。

插入:先搞定插入节点的前驱和后继,再搞定后结点的前驱,最后搞定前结点的后继。

在有序双向链表中定位删除一个元素的平均时间复杂度为O(n)

可以直接删除当前指针所指向的节点。而不需要像单向链表中,删除一个元素必须找到其前驱。因此在插入数据时,单向链表和双向链表操作复杂度相同,而删除数据时,双向链表的性能优于单向链表

5、静态链表

静态链表:用一维数组来实现线性链表,这种用一维数组表示的线性链表,称为静态链表。静态:体现在表的容量是一定的。(数组的大小);链表:插入与删除同前面所述的动态链表方法相同。静态链表中指针表示的是下一元素在数组中的位置。

静态链表是用数组实现的,是顺序的存储结构,在物理地址上是连续的,而且需要预先分配大小。动态链表是用申请内存函数(C是malloc,C++是new)动态申请内存的,所以在链表的长度上没有限制。动态链表因为是动态申请内存的,所以每个节点的物理地址不连续,要通过指针来顺序访问。静态链表在插入、删除时也是通过修改指针域来实现的,与动态链表没有什么分别

顺序表和链表的比较

1、空间性能的比较

空间的开辟

顺序表是需要开辟连续的空间,当需要的空间不够,而有需要插入的时候,就需要再重新开辟空间,将原先的内容拷贝到新的空间,这就开销比较大了。(而且当遇到非内壁类型的数据时,还要考虑深浅拷贝的问题)。而单链表则是每次只需要开辟一个节点,需要的时候再开辟。

空间的使用

但是我们要知道,如果我们已经清楚地知道需要用多少空间来存储数据了,那么我们是选择使用顺序表来进行存储的。因为单链表的话,因为每个节点都会有一个非数据项的指针,造成空间的浪费。并且每次都要开一个节点,每次开辟的地址都是随机的,可能会早成空间碎片。(这个问题在空间配置器后,会得到很好的解决,空间配置器也就是为了解决内存碎片的问题的)

顺序表是可以直接先把空间开辟好的。不用进程开辟空间。所以这个时候,顺序表比较好了。

CPU高速缓存

顺序表的空间一般都是连续开辟的,而且一次会开辟多个存储元素的空间,所以在使用顺序表的时候,可以一次把多个数据写入高速缓存区,再写入主存,顺序表的CPU告诉缓存效率是比较高的。

而碎玉单链表来说,因为是存储一个数据才会开辟一个空间。所以数据存储时都要单独的写入高速缓存区,再写入主存,这就造成了,单链表的CPU高速缓存速率较低。

那么,这样看来,是不觉得单链表就很垃圾了呢?

2、时间性能的比较

时间上的比较

访问随机元素的时间复杂度:因为顺序表是像数组一样的。用下标来访问元素。支持随机访问。但是链表就不可以了,要找到某个元素,必须遍历单链表。所以单链表的时间复杂度是O(N) 顺序表是O(1)

随机插入删除元素:对于顺序表来说,插入是很费力的了,因为,只要插入,就意味着要挪动元素。开销大。但是对于单链表来说就很方便了,只要有这个位置,直接指针连上就好了。所以对于顺序表来说,插入就是O(N),而对于链表来说:O(1)

而对于线性表来说我们使用插入删除的操作要多一些,所以,用单链表相对要好。

详细解释

线性表的应用Java。大家都知道,我们是学Java全栈的,大家就肯定以为我有全套的Java系统教程。没错,我是有Java全套系统教程,进扣裙【47】974【9726】所示,今天小编就免费送!~

“我们相信人人都可以成为一个程序员,现在开始,找个师兄,带你入门,学习的路上不再迷茫。这里是ja+va修真院,初学者转行到互联网行业的聚集地。"

1、线性表的合并

2、有序表的合并

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容