![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法与数据结构
文章平均质量分 91
是以上海科技大学数据结构的教学材料为基础的,对数据结构的进一步学习。
酉鬼2333
废物本废
展开
-
Lecture 24-25
绪论最后三章的内容联系前面的贪心算法主要介绍几类算法(问题,思想),这一章节介绍动态规划。和贪心一样,动态规划不是某个算法,而是一种解决问题的思路,我们在前面介绍过的算法(例如Bellman-ford算法)中就有很多用到这个算法思想的。事实上在重新讨论了贪心算法的整体思路后,我觉得应该按照介绍最短路算法那里的顺序介绍贪心和动态规划(先介绍动态规划再介绍贪心)。Dynamic programmingDynamic programming,也就是我们常说的DP,就是指动态规划,那什么叫做动态规划呢?原创 2022-04-26 14:08:16 · 1190 阅读 · 0 评论 -
Lecture 18
绪论图的部分自最短路算法的三类算法介绍完毕之后就告一段落了,我们往回看Lecture 18。Lecture 18介绍的是算法思想中重要的一种思想——贪心思想,我当时认为先把图论部分的知识点介绍完全再介绍其他的知识点比较好,但是这个思想在Prim算法,Dijkstra算法(甚至于A*算法)等都有用到,不过课件上对贪心算法的概念介绍的不多,例子又比较抽象(没有直接体现出一个阶段到另一个阶段的扩展),再学习完上述的算法之后体会贪心思想我觉得也是很好的(个人觉得)。Definition关于贪心算法首先我们要原创 2022-04-23 16:19:25 · 628 阅读 · 0 评论 -
Lecture 23
绪论前面我们介绍了解决单源结点最短路径问题的算法——Bellman-ford算法和Dijkstra算法,解决单个结点到单个结点最短路径问题的算法——A*算法。但如果我们需要求大量的单个结点到单个结点的最短路径,并且起点和终点并不集中于某一个结点,进行|V|次的Dijkstra算法或Bellman-ford算法和进行|V|2次的A*算法(这种方法的效率不如Floyd算法存疑)在稠密图(O(|E|)=O(|V|2))中的复杂度逼近O(|V|3log|V|)。我们这一章节介绍的Floyd算法能够在O(|V|原创 2022-04-20 15:46:25 · 757 阅读 · 0 评论 -
Lecture 22
绪论前一章节,我们介绍了两种求解单源结点到其他所有结点最短路径(单源最短路径问题)的算法。但如果只是需要求解某一个结点到另一个结点的最短路径(或者求解少量的最短路径对),求解出单个结点到其他所有结点的最短路径就显得不那么必要(效率略低),我们需要设计出更适用于求解某一个结点到另一个结点最短路径的算法。BFS显然是求解某一个结点到另一个结点最短路径的一种算法,这一章节介绍的A*算法则是在静态网络中求解最短路径最有效(?)的直接搜索方法。Background && Idea课件里对A*原创 2022-04-20 00:26:55 · 718 阅读 · 3 评论 -
Lecture 21
绪论前几章节我们介绍了图中的一系列知识点——基础术语(有向,无向,边,顶点,度)和存储方式(邻接矩阵,邻接表),遍历结点的方式(宽度优先遍历和深度优先遍历),拓扑排序(我个人觉得应该将拓扑排序看作图遍历的一种方法)。这一章节我们讨论结点之间不同要求,不同情况下求最优路径的方式。BFS作为一种求单源结点到单源结点最短路径的方式,在其他情况求解最优路径的表现并不适用,同时对于求解单源结点到单源结点最短路径,也有在BFS的基础上优化的更好的算法。Shortest Path这里讨论的最优路径都是最短路径,原创 2022-04-15 01:42:46 · 807 阅读 · 0 评论 -
Lecture 20
绪论我们前面介绍了图的遍历和最小生成树,这一章节介绍图中的另一个重要知识点——拓扑排序。有关拓扑排序,我们不应该仅限于了解拓扑排序的算法,还应该了解拓扑排序的背景(为了解决什么样的问题),拓扑排序有关的数学(图论)知识,算法的运行过程,算法的运行时,拓扑排序另外的应用。第十八章应该是贪心算法,但我个人认为应该先把图上的知识点先介绍完全,所以将顺序调换了一下。Motivation拓扑排序起源于现实中的工程(活动)问题:假设存在若干个工程(活动)希望完成,但是某些工程需要在另外一些工程完成的基础上才能原创 2022-04-03 15:44:31 · 645 阅读 · 0 评论 -
Lecture 17-2
绪论上一章节介绍了图的遍历,这一章节开始介绍图中生成树,最小生成树的概念以及生成最小生成树的算法。Definition and Application首先还是要知道问题和算法涉及概念的定义是什么?Spanning Trees生成树从概念上来看其实一个合成词——一个图的生成(导出)子图中满足树状结构的图称为该图的生成树,例如下图中红色边组成的部分就是该图的生成树:Minimum Spanning Trees很显然生成树的情况不唯一,那么最小生成树的最小指的是什么最小呢?由于生成树的点集和原图原创 2022-03-26 00:20:45 · 767 阅读 · 0 评论 -
Lecture 17-1
绪论上一章节我们介绍了图的基本概念和存储方式,后面的章节对图论中简单的操作和算法依次进行介绍,首先要介绍的即是图的遍历,以及遍历的衍生应用。Graph Traversal图的遍历和树的遍历一样就是将所有的结点全部检查一遍,同样分为可以用递归和栈实现的基于深度的遍历和用队列实现的基于广度的遍历。区别在于,树状结构中结点到结点的路径都是唯一的,也就是说在搜索的过程中不会出现重复搜索的情况,而图中两个节点之间的路径很有可能不唯一,为了在不同分支避免重复搜索的情况,需要额外给每个结点定义一个哈希表或基于原创 2022-03-13 20:46:09 · 1104 阅读 · 0 评论 -
Lecture 16-1
绪论10-15章节我们介绍了数据结构中重要的一部分——树的概念和一些较为重要的应用。从Lecture 16,我们开始介绍数据结构重要的另外一个部分——图。事实上,从图论的角度来看,树应该是隶属于图这部分知识的一个重要部分,树是特殊的一类图。但从很多功能的实现来看,由于树有根节点到各个结点的路径唯一和无环的性质,同样的功能在树结构实现起来可以看作图结构的简化,我个人觉得这是在介绍图的问题之前先介绍树的原因。16-1主要还是介绍图的基本概念·······介绍了好几遍了。Undirected Graph原创 2022-03-11 22:44:42 · 418 阅读 · 0 评论 -
Lecture 15.2
绪论我们前面介绍了树,二叉树,特殊二叉树,堆系列,哈夫曼编码,BST系列,课件上将并查集作为树的最后一个章节进行介绍。事实上并查集比起前面的BST系列,在实现和优化方面都要简单很多,但是在使用方面反而更加灵活,往往可以用来解决一些意料之外的图论问题。Definition首先我们需要知道并查集用来描述什么样的概念?...原创 2022-03-09 21:18:06 · 377 阅读 · 0 评论 -
Lecture 15.1
绪论AVL树是BST往平衡方向的一种优化,红黑树是BST往平衡方向的另一种优化。相较于AVL树对每个结点的平衡因子或者高度严格地调整和修改,红黑树对BST的优化相对宽松和简单,或者说更接近于平衡的本质。关键在于我们如何去定义,从哪个角度来定义平衡二叉树的平衡。ps:百度,哎幕哟法泽,哎幕哟法泽,百度。The idea behind a red-black tree红黑树对于BST的优化和AVL树一样,都是从平衡这个方向进行优化。我个人觉得,我们在直接学习红黑树的定义,即红黑树在BST基础上的优化之原创 2022-03-07 20:30:39 · 267 阅读 · 0 评论 -
Lecture 14
绪论AVL,嘿嘿,我的AVL······AVL TreesAVL树对于BST的优化,就相当于“Complete Heap”对于Heap为了保证左右子树“平衡”的优化,AVL树的定义在BST的定义上需要同一个根节点左右子树的height之差不大于1。例如下面的这棵AVL树,所有左右子树的高度之差都不大于1。Height of an AVL Tree根据AVL树的定义和前面有关“Complete Heaps”的结论,所有基于完全二叉树的BST都是AVL树,所以高度为h的AVL树所包含的结点个数原创 2022-03-02 16:44:20 · 229 阅读 · 0 评论 -
Lecture 13-2
绪论介绍完堆,哈夫曼编码之后,BST它来咯hhhh。(我以为他会开一个单章而不是作为Lecture 13的后半部分介绍的,毕竟比起哈夫曼树,我觉得BST和堆的联系还稍微大一点)。Definition之前在介绍堆的时候,有提到过堆对标的是BST。堆的定义是对于所有的分支节点,子节点的值大于根结点的值(为了说明方便这里用数值来代替优先级),BST的定义是对于所有的分支节点,左子节点的值小于根结点的值小于右子节点的值。从定义上来看,BST左右子节点与父节点的关系比堆结构左右子节点与父节点的关系更加复杂原创 2022-02-28 22:28:36 · 178 阅读 · 0 评论 -
Lecture 13-1
绪论Lecture 10介绍的是树状数据结构,内容包括了两种存储结构——孩子链存储结构,孩子兄弟链存储结构,以及两种遍历方式。Lecture 11介绍了树中最为重要的一个分支二叉树以及将基于孩子兄弟链存储结构的树和森林转化成二叉树的方法。Lecture 12介绍了一种重要的特殊二叉树——堆,以及基于完全二叉树的一种优化方案——“Complete Heap”。"Complete Heap"的一种重要应用就是优先队列,Lecture 13介绍的就是基于优先队列实现的一种重要算法——Huffman cod原创 2022-02-24 15:39:41 · 259 阅读 · 0 评论 -
Lecture 12
绪论这一章节以上一章节介绍的二叉树为基础,介绍了一种简单的特殊二叉树——堆,堆排序是基于堆这种数据结构的排序方法。优先队列是基于堆最基础的几个基本操作的应用,甚至就操作来看可以说优先队列就是堆本身。但是优先队列数据结构在实际应用中的直观感受来看更倾向于添加了优先级这个属性的队列,所以称它为优先队列。事实上实现优先队列除了堆还有其他的实现方式,基于堆的实现是最合适的一种。Priority queue队列是前面已经学过的数据结构,这里不多作赘述。优先级并不是依靠单个变量能够产生的属性。当存在多个同种原创 2022-02-24 00:42:36 · 320 阅读 · 0 评论 -
Lecture 11
绪论作为树状数据结构最为重要的一个分支——二叉树,和课本一样,在树的后面单独拿出来进行介绍。Binary treeBinary tree就是二叉树的意思。在实现和了解二叉树的应用之前,首先需要明白二叉树的定义是什么。有课件上的定义如下:二叉树的每个结点有两个孩子,每个孩子可能为空或者另一棵二叉树子树。有另外的定义如下:每个结点的度都小于等于n的树称为n叉树。我本来认为这样的定义远比上面模糊且抽象的定义要更加精简确切,但当我仔细品味英文定义中exactly这个词的意思,又有了新的理解:因为原创 2022-02-22 16:08:37 · 688 阅读 · 0 评论 -
Lecture 10
绪论第十章对应的是课本上第六章的第一节,也就是树。Tree structure树是离散数学中图论里面的一个概念,数据结构中的树一般都是指的离散数学中的有根树(且一般是有向的)。有关树的性质离散数学中介绍的要比数据结构详细很多,有关树的概念和性质建议直接看离散数学,这里只做部分知识和概念的复习。Parent,Children,Siblings首先讨论的是结点与结点之间的关系。如果两个结点相邻,对于两个结点构成的边,起点为终点的parent(父节点),终点为起点的chidren(子节点)。例如下面原创 2022-02-21 10:55:28 · 457 阅读 · 2 评论 -
Lecture 9
绪论这一章节介绍的是divide-and-conquer multiplication,divide的意思是分开,conquer的意思是占据,控制,divide-and-conquer直译下来就是分开后控制,其实就是分而治之的意思,multiplication的意思是乘法。divide-and-conquer multiplication算法的主要核心思想就是分治,通过分治来简化各种较为复杂的乘法运算。Integer Multiplication首先讨论实数与实数(整型与整型,浮点型与浮点型)之间的原创 2022-02-13 22:50:10 · 333 阅读 · 0 评论 -
Lecture 8
绪论Lecture 7主要介绍的是冒泡排序的一些优化和归并排序的相关知识点,这一章节介绍的就是快速排序,快速排序作为目前内置排序函数源码所用的算法,重要性不言而喻,并且快速排序虽然运行效率高,但是在不同情况下的运行效率差异很大,对于不同的情况也需要不同的处理策略。The idea behind the algorithm归并排序是将一个序列等分成两个子序列,然后将两个子序列进行合并,算法基于的核心思想是递归分治算法。快速排序直接从代码的角度来看感觉和递归分治算法类似:选取序列中的一个元素的值作为原创 2022-02-09 19:48:44 · 703 阅读 · 0 评论 -
Lecture 7
绪论Lecture 7和lecture 8两章介绍的都是有关排序的部分,说是十种排序,其实最主要介绍的一般都是快速排序和归并排序。Bubble Sort冒泡排序就是每次将当前序列中优先级最大的元素“上浮”到当前序列的最后。每次内部的循环将当前序列中的每个元素从前到后遍历一遍,遍历的过程中将当前遍历到的优先级最大的元素向后调整,与优先级最小的元素交换位置,这个过程我们称之为“上浮”。所以有一般的代码如下:void bubble_sort(int*a,int n){ for (int i=0;i原创 2022-01-30 13:59:23 · 1407 阅读 · 0 评论 -
Lecture 5
绪论这一章介绍的内容是哈希表,又叫哈希技术。有关哈希技术,很多人是从十大排序中的哈希排序中了解到的。事实上哈希排序是计数排序和哈希技术的结合,哈希计数用来快速查找的功能更为地基础和根本,课件就是从这方面逐步介绍哈希技术的用处和设计方法以及技巧(技巧方面与课本上的大差不差)。Introduction首先有这样的一个例子:假设存在一个系统中有大约150个错误(异常)情况,每一种情况由一个2进制的16位数标识,更为确切的说法是作为索引。现在需要通过16位的标识符来调用相应地错误处理函数。一种做法是原创 2022-01-28 14:36:35 · 1210 阅读 · 6 评论 -
Lecture 4
绪论比起课本上更加详细的时间复杂度的介绍。Justification for analysis这一章的标题是algortihm analysis,也就是算法分析。算法是用数学,计算机来解决问题的方法,在得到算法之后,我们需要从算法运行的快慢,空间的占用大小,利用率,出错的概率等不同的角度来评判和比较这些算法,从而在不同的场合选择不同的算法。这个评判和比较的过程从学科专业的角度就叫做算法分析。ppt这里举了一些例子,比如在有序表中寻找某个元素。这里提供了线性查找和二分查找两种算法。初始化原创 2022-01-23 16:32:57 · 986 阅读 · 0 评论 -
Lecture 3-2
绪论Lecture3-2介绍的就是队列的实现和应用,不过应用这部分就是最简单的一些和概念关系比较大的应用。Queue ADT同样是线性的数据结构。比起前面的数据结构,队列稍微有点特殊的就是有一个队首(front)和一个队尾(back,不过很多时候都叫rear),队首出队(pop),队尾进队(push),先进队的先出队,后进队的后出队,满足FIFO(先进先出)原则。更常规的,像课本就是用enqueue,dequeue作为操作名的,不过head和tail我基本没有见到过。和栈一样,队列的实现方原创 2022-01-21 22:23:56 · 179 阅读 · 0 评论 -
Lecture 3-1
绪论大致地看了一下,这一章主要介绍的是栈的概念及其运用。除了一些最为人熟知的如递归栈,波兰逆波兰表达式,还有一些比较特殊的课本上没有的应用。Stack ADTlinear(线性的),说明栈依旧是一个线性的数据结构。栈的基本操作比较少,就是进栈,出栈,创建(销毁)和判空(判满这个操作是有点争议的,因为链栈是不会出现爆栈的情况)。栈有链表和数组的两种实现方式:Singly linked lists前面的单链表的模板类:基于单链表的链栈的模板类:事实上所有的操作都是lecture 2单链原创 2022-01-21 13:51:57 · 852 阅读 · 0 评论 -
Lecture 2
绪论有关线性表的介绍,书上首先提出了下面这样一个问题(例子):如何计算一个多项式(polynomial)的值?就算法的角度而言,主要是以下两种思路:第一种是最常规的做法,将多项式中的每一个单项式分别计算出他们的结果相加,但这么做会重复计算很多次x方幂。更值得提倡的做法是第二种,用类似与递推的方法通过i-1次多项式的值来求i次多项式的值,因为i-1次多项式中0次到i-1次的部分已经计算完成,于是不会出现太多重复计算的情况。算法大致如上,接下来的问题是用哪种数据结构。如果是用普通的顺序存储结构原创 2022-01-19 20:28:43 · 494 阅读 · 0 评论