算法与数据结构

数据结构之绪论

会有一股神秘感。 提交于 2020-03-05 16:20:07
文章目录 1.基本概念和术语 2.算法和算法分析 1.基本概念和术语 数据:对客观事物的符号表示,在计算机科学中是指所有能输入到计算机并被计算机程序处理的符号的总称 数据元素:数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。 数据对象:性质相同的数据元素的集合,是数据的一个子集 数据结构:相互之间存在一种或多种特定关系的数据元素的集合 存储结构:数据结构在计算机中的表示,包括数据元素的表示和关系的表示,有顺序存储结构和链式存储结构 数据类型:刻画操作对象的特性 抽象数据类型:指一个数学模型以及定义在该模型上的一组操作 2.算法和算法分析 算法的五个特性: 有穷性 确定性 可行性 有输入 有输出 算法设计的要求 正确性 可读性 健壮性 效率与低存储量需求 算法效率的度量 事后统计的方法 缺点:一是先必须运行依据算法编制的程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素。 事先分析估算的方法 一个算法是由控制结构(顺序、分支和循环3种)和源操作(指固有数据类型的操作)构成的,则算法时间取决于两者的综合效果。通常的做法是,从算法中选取一种对于研究的问题来说是基本操作的原操作,以该基本操作重复执行的次数作为算法的时间量度。 算法的渐进时间复杂度,简称时间复杂度:T(n) = O(f(n)) 算法的空间复杂度:S(n) = O(f(n))

Data Structures[翻译]

a 夏天 提交于 2020-03-05 14:24:52
Data Structures 【原文见: http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=dataStructures 】 作者 By timmac TopCoder Member 翻译 农夫三拳@seu drizzlecrj@gmail.com 即使计算机能够毫不夸张的每秒执行上百万次的数学运算,当一个问题变得庞大且复杂时,性能仍然是一个很重要的考虑方面。最至关紧要的关于快速解决问题的方面之一就是数据在内存中是如何存储的。 为了举例说明这点,可以试想你进入一个图书馆去查找某个学科的一本书。最有可能的是你能够使用一些电子参考或者在最坏情况下,有一个卡片目录来帮助你找到你想要的书的名称和作者。由于书籍都是按目录进行排放的并且在每一个目录中是按照作者的姓名排序的,因此这是一个直接并且轻松的过程,那么然后你就可以在书架上找到你想要的书了。 现在,假定你去图书馆找一本特定的书,然而这里没有排放好的书架,只有在房间角落有一些排成行的袋子,里面放满了可能相关可能不相关的书。这样就可能需要数个小时甚至数天来找到你需要的书了,这是一个对比性强的道理。这就是数据在没有存储为与应用相关的格式时软件运行的情况。 简单的数据结构(Simple Data Structures) 最简单的数据结构是原生的变量。他们存放单个值,并且使用中受限

数据结构与算法单排日记-2020/2/29-队列

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-05 06:25:27
1.队列是一个有序列表,可以用数组或者链表表示。 2.遵循先入先出的原则:先存入队列的数据,要先取出。后存入的要后取出。 数组模拟队列 队列本身是一个有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下。其中 maxSize是该队列的最大容量 。 因为队列的输出、输入分别从前后端来处理,因此需要两个 变量front及rear分别记录前后端 的下标。 初始化 rear初始值默认为-1; rear指向队列尾的位置(就是队列尾) front初始值默认为-1; front指向队列首的前一个位置(不是队列首) 将数据存入队列(addQueue): 将尾部指针往后移,rear+1,如果front=rear,则队列为空 若rear小于最大下标maxSize-1,那么将数据存入rear所指的数组元素中。否则无法存入。 rear==maxSize-1,则队列已满。 当数据出队列时: 首指针往后移:front+1 代码实现: public class DemoQueue { /* 当将数据存入队列时: 1.将尾指针往后移:rear+1,当front==rear,队列为空 2.若尾指针rear==maxSize-1时,队列满,无法存入数据 当数据出队列时: 首指针往后移:front+1 */ private int maxSize ; //数组最大容量 private int rear ;

数据结构--堆

泄露秘密 提交于 2020-03-05 02:48:25
堆,与其说是一种数据结构,不如说是一种排序算法。用堆算法,可以轻松得到一组数据中最大的或最小的元素。 其结构就是完全二叉树的顺序存储方式。即在一个数组中存储一颗完全二叉树。 通常,堆分为"大根堆"和"小根堆",前者的树顶元素是数组中最大的一个,后者是最小的一个。 常用操作: 入堆:元素被加入到堆中,以小根堆为例,新元素首先被放到队列最尾端,然后何其父节点比较,如果小于其父节点,则交换两者。以此类推,一直追溯到树顶元素,或者在半途,它不再小于它的父节点。操作完成。 出堆:出堆操作,就是得到当前队列中最大或最小的元素。对于一个合法的堆结构,其首元素就是所要找的。关键是这个元素取出后,其他元素要填补其移走的空白。和入堆操作相反,出堆操作是从树顶至叶节点的操作。 将一个队列构建成堆:这个操作相对复杂一些,每次都从堆底向堆顶找到其最大或最小的元素,然后分别对起两个子节点作此操作。 1 #include " Array.h " 2 #include < utility > 3 #include < algorithm > 4 template < typename T > 5 class heap 6 { 7 public : 8 heap(){} 9 10 void push_heap( const T & data) 11 // 入堆 12 { 13 if (m_array.empty()

算法与数据结构——排序(六)堆排序

馋奶兔 提交于 2020-03-05 02:46:33
在前面的排序算法里面,我们发现每次找到一个最小的数都要进行很多次的比较,比如在n个数里面,我们如果想要找到最小的数,那么就需要比较 n-1次,那么我们想,能不能减少每次比较的次数呢。 其实发现是可以的,在前面的简单选择排序算法里面,我们每次找到最小的数后,剩余的一些数,其实有的是已经经过比较了的,所以在我们寻找第二小的数的时候,完全可以利用第一次的比较结果,但是由于我们没有把第一次比较的结果记录下来,所以我们在后面的比较过程中用不到,那么我们会想,能不能想办法把第一次比较的结果保存下来呢。办法肯定是有的,这就是今天我们要学习的堆排序。 那么什么是堆排序呢,我们首先要弄清楚什么是堆。看下面的两个图,它们都是堆: 通过图我们可以看出,它们的根结点,要么比他们的左右孩子都大,要么比他们的左右孩子都小。这就是堆。具体的定义就是: 堆是具有以下性质的完全二叉树,每个结点的值都大于或者等于其左右孩子结点的值,叫做大顶堆,每个结点的值都小于或者等于其左右孩子结点的值,叫做小顶堆。由二叉树的一个性质,我们可以知道,一个完全二叉树,如果它的根结点位置是i,那么它左孩子位置就是2i,右孩子位置就是2i+1,所以大顶堆可以定义为ki>=k2i并且ki>=k2i+1,小顶堆的符号刚刚相反。 把堆进行层序遍历装入数据组,是如下结果: 堆排序算法,就是把一个序列构造成一个大顶堆(此处以大顶堆为例)

数据结构与算法(一):浅谈数据结构

喜欢而已 提交于 2020-03-04 17:27:54
什么是数据结构 简单来说, 数据结构+算法=程序。 传统上,我们把数据结构分为 逻辑结构 和 物理结构 。 逻辑结构 :是指数据对象中数据元素之间的互相关系,也是我们今后最需要关注和讨论的问题。 物理结构 :是指数据的逻辑结构在计算机中的存储形式。 逻辑结构: 集合结构:内部除了同属一个集合外,没有其他关系。 线性结构:线性结构中的数据元素之间是一对一的关系。 树形结构:树形结构中的数据元素之间存在一种一对多的层次关系。 图形结构:图形结构的数据元素是多对多的关系。 物理结构: 数据元素的存储结构形式有两种:顺式存储结构和链式存储结构。 顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。 例如我们编程语言的数组结构就是典型的顺序存储结构。 链式存储结构:从顺序存储结构我们想到了日常生活中的排队,但现实生活中,我们发现不是完全如此。 例如排队时,有人被迫离开队伍去上洗手间,还有人不遵守基本道德规范插队,这些情况会破坏 存储结构的基本原则 。面对这样时常要变化的结构,顺序存储结构是不安全的,所以引出 链式存储结构 。 例如现在的银行、医院叫号系统,排队时无论你在哪里,只需要关注你的“号”有没有被叫到。 链式存储结构就是这样的原理,把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。 很显然

大话数据结构第三章

你。 提交于 2020-03-04 06:14:51
线性表:另个或多个数据元素的有限序列 首先是线性的,单列的,一个数据元素后面或者前面不能同时对应两个元素,只能对应一个元素,这个前面的元素叫做直接前驱元素,后面的元素叫做直接后继元素。元素个数为0的时候,称为空表。 在比较复杂的线性表中,一个数据元素可以由若干个数据项组成。 线性表抽象数据类型,还介绍几种基本操作吧: InitList(*L) 初始化操作,证明L表是空的。 ListEmpty(L) 若列表为空,返回true 否则返回false ClearList(*L) 清空表 GetElem(L ,i,*e) 将线性表中的第i个元素值返回给e LocateElem(L,e) 在线性表中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败。 ListInsert (*L,i,e) 在线性表L中的第i个位置插入新元素e ListDelete(*L,i,e) 删除线性表L中第i个元素位置,并用e返回其值。 ListLength(L) 返回线性表L中的元素个数 3.4 线性表的顺序存储结构 指的是用一段地址连续的存储单元一次存储线性表的数据元素 数组的长度和线性表的长度有区别:数组的长度是存放线性表的存储空间的长度,存储分配之后一般这个量是不变的。 线性表的长度是线性表中的数据元素的个数,随着线性表的插入和删除操作的进行,这个量是变化的。

基础数据结构之链表

♀尐吖头ヾ 提交于 2020-03-03 03:40:28
单链表 :链表中的每个元素实际上是一个单独的对象,而所有对象都通过每个元素中的引用字段链接在一起。 双链表 :与单链表不同的是,双链表的每个结点中都含有两个引用字段。 链表的优点如下 : 链表能灵活地分配内存空间; 能在 O(1)时间内删除或者添加元素,前提是该元素的前一个元素已知,当然也取决于是单链表还是双链表,在双链表中,如果已知该元素的后一个元素,同样可以在O(1) 时间内删除或者添加该元素。 链表的缺点是 : 不像数组能通过下标迅速读取元素,每次都要从链表头开始一个一个读取; 查询第 k 个元素需要 O(k) 时间。 **应用场景:**如果要解决的问题里面需要很多快速查询,链表可能并不适合;如果遇到的问题中,数据的元素个数不确定,而且需要经常进行数据的添加和删除,那么链表会比较合适。而如果数据元素大小确定,删除插入的操作并不多,那么数组可能更适合。 相关LeetCode经典的练习题请关注公众号,从『菜单-算法-数据结构』对应文章中获取。 来源: CSDN 作者: BaryLeo 链接: https://blog.csdn.net/weixin_41878312/article/details/104619822

PYTHON数据结构与算法学习笔记(六)

[亡魂溺海] 提交于 2020-03-03 02:52:56
目录 树与树算法 树的概念 树的存储与表示 二叉树 二叉树的性质 二叉树的创建 二叉树的遍历 广度优先遍历(层次遍历) 深度优先遍历 树与树算法 树的概念 树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 1、每个节点有零个或多个子节点; 2、没有父节点的节点称为根节点; 3、每一个非根节点有且只有一个父节点; 4、除了根节点外,每个子节点可以分为多个不相交的子树。 例 : 树的术语 1、 节点的度 :一个节点含有的子树的个数称为该节点的度; 2、 树的度 :一棵树中,最大的节点的度称为树的度; 3、 叶节点或终端节点 :度为零的节点; 4、 父节点 :若一个节点含有子节点,则这个节点称为其子节点的父节点; 5、 子节点 :一个节点含有的子树的根节点称为该节点的子节点; 6、 兄弟节点 :具有相同父节点的节点互称为兄弟节点; 7、 节点的层次 :从根开始定义起,根为第1层,根的子节点为第2层,以此类推; 8、 树的高度或深度 :树中节点的最大层次; 9、 堂兄弟节点 :父节点在同一层的节点互为堂兄弟; 10、 节点的祖先 :从根到该节点所经分支上的所有节点;

数据结构——复习四

自古美人都是妖i 提交于 2020-03-02 14:50:48
//虽然我觉得,我刚开始复习的这些,在库里其实有可以直接调用的,有现成的,但我们还需要明白这是一种思想,所以我静下心来好好体会了一下,做这些事,其实都是很有必要的。 串(字符串):是零个或多个字符组成的有限序列。记作: S=“a1a2a3…”,其中S是串名,ai(1≦i≦n)是单个,可以是字母、数字或其它字符。 串值:双引号括起来的字符序列是串值。 串长:串中所包含的字符个数称为该串的长度。 空串(空的字符串):长度为零的串称为空串,它不包含任何字符。 空格串(空白串):构成串的所有字符都是空格的串称为空白串。 注意:空串和空白串的不同,例如“ ”和“”分别表示长度为1的空白串和长度为0的空串。 子串(substring):串中任意个连续字符组成的子序列称为该串的子串,包含子串的串相应地称为主串。 子串的序号:将子串在主串中首次出现时的该子串的首字符对应在主串中的序号,称为子串在主串中的序号(或位置)。 串相等:如果两个串的串值相等(相同),称这两个串相等。换言之,只有当两个串的长度相等,且各个对应位置的字符都相同时才相等。 串在计算机中有三种存储方式: 1.定长顺序存储:将串定义成字符数组,利用串名可以直接访问串值。用这种表示方式。串的存储空间在编译时确定,其大小不能改变。 # define MAX_STRLEN 256 //存储结构定义 typedef struct {