其实探索2020年:年度回顾与展望的问题并不复杂,但是又很多的朋友都不太了解,因此呢,今天小编就来为大家分享探索2020年:年度回顾与展望的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!
数据结构:
数据结构是具有结构特征的数据元素的集合。它研究数据的逻辑结构和数据的物理结构以及它们之间的关系,并为这种结构定义适当的操作和设计。提出相应的算法,保证这些操作后得到的新结构体仍然保持原来的结构体类型。简而言之,数据结构是相互之间具有一种或多种特定关系的数据元素的集合,即具有“结构”的数据元素的集合。 “结构”是指数据元素之间的关系,分为逻辑结构和存储结构。
数据的逻辑结构和物理结构是数据结构密切相关的两个方面。相同的逻辑结构可以对应不同的存储结构。算法的设计取决于数据的逻辑结构,算法的实现取决于指定的存储结构。
数据结构的研究内容是构建复杂软件系统的基础,其核心技术是分解和抽象。通过分解,可以将数据分为三个层次;通过抽象,丢弃数据元素的具体内容,得到逻辑结构。类似地,操作的定义是通过将处理需求分解为各种功能,然后通过抽象丢弃实现细节来获得的。上述两个方面的结合可以将问题转化为数据结构。这是一个从具体(即具体问题)到抽象(即数据结构)的过程。然后,通过考虑实现细节,进一步得到存储结构和实现操作,完成设计任务。这是一个从抽象(即数据结构)到具体(即具体实现)的过程。
数据的逻辑结构
是指反映数据元素之间逻辑关系的数据结构。逻辑关系是指数据元素之间的前后关系,无论它们在计算机中的存储位置如何。逻辑结构包括:
1、集合:数据结构中的元素之间除了“属于同一集合”的相互关系外,没有其他关系;
2、线性结构:数据结构中的元素具有一一对应的关系;
3、树结构:数据结构中的元素具有一对多的关系;
4.图结构:数据结构中的元素具有多对多的关系。
数据的逻辑结构
是指反映数据元素之间逻辑关系的数据结构。逻辑关系是指数据元素之间的前后关系,无论它们在计算机中的存储位置如何。逻辑结构包括:
1、集合:数据结构中的元素之间除了“属于同一集合”的相互关系外,没有其他关系;
2、线性结构:数据结构中的元素具有一一对应的关系;
3、树结构:数据结构中的元素具有一对多的关系;
4.图结构:数据结构中的元素具有多对多的关系。
数据的物理结构
指数据逻辑结构在计算机存储空间中的存储形式。
数据的物理结构是数据结构在计算机中的表示(也称为图像),包括数据元素在机器内的表示和关系在机器内的表示。由于具体的实现方法包括序列、链接、索引、散列等,因此一个数据结构可以表示为一个或多个存储结构。
数据元素的机上表示(映射方法):数据元素表示为二进制位(bit)的位串。该位串通常称为节点。当一个数据元素由多个数据项组成时,位串中每个数据项对应的子位串称为数据域。因此,节点是数据元素的机器内表示(或机器内图像)。
关系的机上表示(映射法):数据元素之间关系的机上表示可以分为顺序图像和非顺序图像。常用的两种存储结构:顺序存储结构和链式存储结构。顺序映射通过数据元素在内存中的相对位置来表示数据元素之间的逻辑关系。非顺序图像借助指示元素存储位置的指针来表示数据元素之间的逻辑关系。
数据结构有很多种类型。一般来说,数据简单地按照其逻辑结构来分类,包括线性结构和非线性结构。
线性结构
简单来说,线性结构就是表中的每个节点都存在线性关系。如果从数据结构的语言来描述,线性结构应该包括以下几点:
1、线性结构是非空集。
2. 线性结构只有一个起始节点和一个终止节点。
3、线性结构中的所有节点最多有1个直接前驱节点和1个直接后继节点。
线性表是典型的线性结构,栈、队列、字符串等都是线性结构。
非线性结构
简单来说,非线性结构是指表中的节点之间存在多个对应关系。如果从数据结构的语言来描述,非线性结构应该包括以下几点:
1. 非线性结构是非空集。
2.非线性结构中的节点可以有多个直接前驱节点和多个直接后继节点。
在实际应用中,数组、广义表、树结构、图结构等数据结构都是非线性结构。
常用数据结构
随着计算机科学的发展,数据结构也在发展。编程中常用的数据结构包括以下几种。
大批
数组是一种聚合数据类型,它是相同类型的变量的有序集合。数组可以说是最基本的数据结构,在各种编程语言中都有对应的数组。一个数组可以分解为多个数组元素。根据数据元素的类型,数组可以分为整型数组、字符数组、浮点数组、指针数组和结构体数组。数组还可以用一维、二维和多维形式表示。
堆
栈是一种特殊的线性表,只能在表的固定一端插入和删除数据节点。栈按照后进先出的原则存储数据。也就是说,先插入的数据会被压入栈底,最后插入的数据会在栈顶。读取数据时,会从栈顶开始一一读取。堆栈常用于汇编语言程序中,对重要数据进行现场保护。当栈中没有数据时,称为空栈。
队列
队列与栈类似,也是一种特殊的线性链表。与堆栈不同,队列只允许在表的一端进行插入操作,在另一端进行删除操作。一般来说,执行插入操作的一端称为队列尾部,执行删除操作的一端称为队列头。当队列中没有元素时,称为空队列。
链表
链表是一种数据结构,其中数据元素按照链接的存储结构进行存储。这种存储结构在物理上是不连续的。链表由一系列数据节点组成,每个数据节点包括数据字段和指针字段。其中,指针字段存储数据结构中下一个元素的地址。链表结构中数据元素的逻辑顺序是通过链表中指针的链接顺序来实现的。
树
树是一种典型的非线性结构,是一个包含2个节点的有限集K。在树结构中,只有一个根节点,并且该节点没有前驱节点。树结构中的所有其他节点都只有一个前驱节点,并且可以有两个后继节点,m0。
图形
图是另一种非线性数据结构。在图结构中,数据节点通常称为顶点,边是有序的顶点对。如果两个顶点之间有边,则说明这两个顶点有相邻关系。
堆
堆是一种特殊的树形数据结构,一般讨论的堆都是二叉堆。堆的特点是根节点的值是所有节点中最小或最大的,并且根节点的两个子树也是一个堆结构。
哈希值
哈希表源自哈希函数(Hash function)。其思想是,如果结构体中存在关键字等于T的记录,那么在F(T)的存储位置一定能找到该记录,所以不需要比较。直接获取已检查记录的操作。
算法定义:
算法是解决特定问题的步骤的描述。它在计算机中表示为有限的指令序列,每条指令代表一个或多个操作。每个操作都有特定的功能。
算法的基本特点:
(1)输入和输出:算法有0个或多个输入和至少一个或多个输出;
(2)有限性:是指执行有限数量的步骤后,算法自动结束,不会无限循环,并且每一步都在可接受的时间内完成;
(3)确定性:算法的每一步都有明确的含义,不会出现歧义。
(4)可行性:算法的每一步都必须是可行的,即每一步都可以通过执行有限次数来完成;
算法设计要求:
(1)正确性:算法的正确性是指该算法至少应具有明确的输入、输出和处理,能够正确反映问题的需求,能够得到问题的正确答案;
(2)可读性:算法设计的另一个目的是方便阅读、理解和交流。
(3)鲁棒性:当输入数据非法时,算法也能进行相关处理,而不是产生异常或莫名其妙的结果;
(4)时间效率高但存储容量低:时间效率是指算法的执行时间。对于同一问题,如果有多种算法可以解决,则执行时间短的算法效率较高,执行时间较长的算法效率较低。存储需求是指算法执行过程中所需的最大存储空间,主要是指算法程序运行时占用的内存或外部硬盘存储空间。设计算法应尽量满足高时间效率和低存储容量的要求。
常用算法
数据结构研究的内容是:如何按照一定的逻辑结构组织数据,并选择合适的存储表示方法,将逻辑组织好的数据存储到计算机内存中。研究的目的是更有效地处理数据,提高数据运营效率。数据操作是在数据的逻辑结构上定义的,但操作的具体实现必须在存储结构上进行。一般来说,常见的操作有以下几种:
(1) 搜索。检索就是在数据结构中寻找满足一定条件的节点。一般来说,给定某个字段的值,找到具有该字段值的节点。
(2) 插入。向数据结构添加新节点。
(3)删除。从数据结构中删除指定的节点。
(4)更新。更改指定节点的一个或多个字段的值。
(5)排序。按指定顺序重新排列节点。例如增加或减少。
以上是我认为你需要了解的数据结构和算法入门知识!
时间复杂度和空间复杂度
时间复杂度
(1)时间频率
理论上无法计算执行算法所需的时间。您必须在计算机上运行测试才能知道。但我们不可能也没有必要在计算机上测试每一个算法。我们只需要知道哪种算法花费更多时间,哪种算法花费更少时间。算法所花费的时间与算法中语句的执行次数成正比。哪个算法执行的语句越多,执行的时间就越多。算法中语句执行的次数称为语句频率或时间频率。将其表示为T(n)。算法的时间复杂度是指执行算法所需的计算量。
(2)时间复杂度
在刚才提到的时间频率中,n称为问题的大小。当n不断变化时,时间频率T(n)也会不断变化。但有时我们想知道它变化时表现出什么样的模式。为此,我们引入时间复杂度的概念。
一般来说,算法中基本操作的重复次数是问题规模n的函数,用T(n)表示。如果存在某个辅助函数f(n),则存在一个正常数c,使得fn*c=T(n)不断成立。记为T(n)=O(f(n)),O(f(n))称为算法的渐近时间复杂度,简称时间复杂度。
在各种算法中,如果算法中的语句执行次数为常数,则时间复杂度为O(1)。另外,当时间频率不同时,时间复杂度可能相同,比如T(n)=n^2+3n+4 和T(n)=4n^2+2n+1 频率不同,但是时间复杂度相同,都是O(n^2)。
按数量级递增排列,常见的时间复杂度为:
常数阶O(1)、对数阶O(log2n)(n 以2 为底的对数,下同)、线性阶O(n)、
线性对数阶O(nlog2n)、平方阶O(n^2)、立方阶O(n^3)、
k 次幂阶为O(n^k),指数阶为O(2^n)。随着问题规模n不断增大,上述时间复杂度不断增大,算法的执行效率变低。
这是我捕获的视频中的常见时间复杂度表:
空间复杂度
与时间复杂度类似,空间复杂度是算法在计算机内执行时所需存储空间的度量。记录为:
S(n)=O(f(n))
算法执行过程中所需的存储空间包括3部分:
算法程序占用的空间;
输入初始数据占用的存储空间;
算法执行期间需要额外的空间。
在很多实际问题中,为了减少算法占用的存储空间,通常会采用压缩存储技术。
线性表
1.序列表(数组)
1、性质:随机访问(快速查找、直接定位)存储密度高,只存储数据元素插入和删除操作需要大量移动元素(插入平均移动n/2个元素,删除平均移动n/2个元素) (n-1) /2 个元素)
2、插入序列表:时间复杂度:O(n);空间复杂度:O(1)
//首先判断插入是否合法(略) for(inti=L.length;i=pos;i--)//pos为插入位置,数组下表从0开始L.data[ i]=L.data[ i-1];L.data[i-1]=e;//e为插入元素L.length++;//线性表长度加1
3、删除序列表:时间复杂度:O(n);空间复杂度:O(1)
//首先判断删除是否合法(略) for(inti=pos;i
4.顺序表访问:时间复杂度:O(1)(基于随机访问)
5. 遍历和交换序列表过于简单。我想大多数人读完这本书就知道了。
6.算法分析(以后会有专题,这个阶段首先要打好基础,有能力的同学可以尝试写数组的逆;用O(n)的方法删除不等于5的数组。 合并操作)这些将在稍后讨论;
2.链表
1. 单链表
性质:非随机存储(查找需要逐一遍历),所以查找慢,插入删除操作快(假设已经找到位置)
头指针指向链表的第一个结点,即头结点的链表第一个结点(通常不存储信息)。
PS:为什么要设置头节点?链表可以统一操作,边界操作也可以统一。
头结点:第一个有效数据的地址为L-next
无头节点:第一个有效数据的地址L
建立:头插入法、尾插入法(设置一个节点指针rear指向表尾)
插入:O(n) 如下图
插入到第i个位置
p=GetElem(L,i-1);//时间复杂度O(n)s-next=p-next;//注意的顺序不能改变。如果交换,链接就会断开,并且会找到i-1。还不如原来的i p-next=s;//(注意有时候这个插入操作只强调插入,也就是最后两行代码,也就是O(1))
注意一个小细节。我的图和书上的不一样。我的“”箭头的起点与“圆”相连。其实“”就是下一个字段,“圈”就是数据字段。它们是相连的。它是一个结构。书中的箭头和圆圈是分开的。我想这并不能帮助我们学生理解。从现在开始,我将使用下面的写法来绘制节点,以便能够完整保留节点的存储特性。
写在书上
有助于理解的写作风格
删除:O(n)如下图
删除第i个元素
p=GetElem(L, i-1); //时间复杂度O(n),后续操作都是O(1)
q=p-下一个;
p-下一个=q-下一个;
自由(q);
问题:对于带有尾指针的单链表,在链表末尾插入一个元素的时间复杂度为O(1),但在链表末尾删除一个元素的时间复杂度为O(n) 。你能想一下为什么吗?
回答:
不知道大家有没有注意到,插入(删除)操作需要找到插入(删除)元素之前的元素。我们上面用“p”来指向它,后面的所有操作都是通过这个“p”完成的。
在尾指针rear的链表中,只需使用rear-next=s进行插入即可,因为rear是要插入的节点的前驱节点。
要删除表尾的元素,需要找到rear的前驱节点。由于是单链表,所以需要进行遍历找到rear的前驱节点,然后进行删除操作。
PS: 大家都知道为什么要设置头节点。正是因为有了头节点的前驱节点,插入(删除)操作才会被统一。 (链表为空时插入,链表剩余时删除)
总之,在单链表的操作中,大家一定要注意要插入(删除)的前驱节点的学习。上面总结的内容大家应该都明白了。
2、双链表:在单链表的基础上,该结构增加了一个指向前驱节点优先级的指针。
3、循环单链表:在单链表的基础上,链表末尾的next指向链表的头部r-next=L;
4、循环双链表:在循环单链表的基础上,该结构增加了一个指向前驱节点优先级的指针,加上L-prior=r; r-下一个=L;
5、静态链表:使用连续的块内存空间作为链表(与操作系统的文件管理中文件分配方式的显示链接相同)
上面提到的这些都与单链表的基本操作密不可分。只要你彻底理解了单链表,这些都是小情况。
我认为适合我的笔记并不意味着把所有的东西都写得很详细,而只是给我一个索引。具体书上说的很清楚了,不需要重复,不然就跟抄书一样了。有一个区别。
3、序列表和链表的选择:
通常比较稳定的线性表是顺序存储的。 (静止的)
插入、删除操作频繁的线性表采用链式存储(动态)
【探索2020年:年度回顾与展望】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
2020年的事还历历在目!
有12位网友表示赞同!
回想起2020年那段时间的新闻,感觉都像是在昨天发生一样。
有16位网友表示赞同!
2020年确实是一个特殊的年份,会永远记住它。
有12位网友表示赞同!
不知道其他朋友是怎样度过2020年的?
有9位网友表示赞同!
当年还在上网课的时候,印象最深的就是2020年了!
有14位网友表示赞同!
好多人都在说2020年是转折点,你觉得呢?
有12位网友表示赞同!
希望2020年的经验教训能够帮助我们未来的生活。
有9位网友表示赞同!
那个时候真是太焦虑了,不知道什么时候才能恢复正常。
有18位网友表示赞同!
现在想想2020年真是令人感慨万千!
有14位网友表示赞同!
虽然2020年经历了许多困难,但我们也更加团结。
有13位网友表示赞同!
那时候大家都很宅在家,感觉时间过得格外缓慢。
有5位网友表示赞同!
不知道当年那些新闻现在情况怎么样了?
有13位网友表示赞同!
2020年的照片一看就是当时特有的气氛了!
有6位网友表示赞同!
2020年真是太难忘的一年了,很多事情都发生了变化。
有5位网友表示赞同!
那时候很多人都在积极乐观地生活着,希望我们永远保持信心!
有12位网友表示赞同!
希望2020年的所有美好都能被记住。
有15位网友表示赞同!
想想当年大家为了共同的目标努力的样子真是令人感动!
有7位网友表示赞同!
2020年对于我们每个人来说都留下了深刻的印记。
有6位网友表示赞同!
未来还有很多未知,希望我们能够继续前进!
有7位网友表示赞同!
我相信无论遇到什么困难,我们都能克服!
有8位网友表示赞同!