
数据结构与算法
文章平均质量分 61
A.Crocodile
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
算法学习随笔——3.算法分析原理(搜索问题优化)
这里主要记录的是算法学习过程中,值得学习和借鉴的解决问题思路。并不能解决某一特定的现实问题。用做启发和思考。在日常工作中,经常会遇到搜索问题。比方红外功能实现的遥控器键值表中,搜索特定键值、其中包括各种呈线性规则的数据表中搜索特定数据。常规的方式就是遍历搜索例1.这样的时间复杂度为O(N),功能实现有两种情况,一种是找到数据并返回数据下标,另一种是找不到数据。当出现最坏的情况,和找不到数据的情况都需要遍历整个数组,循环操作N次。但是如果将特定的线性数据按照顺序排列,那么我们程序的消耗时间就会降低。例1原创 2022-06-06 14:56:04 · 253 阅读 · 0 评论 -
算法学习——2.连通性问题(二)
1.2.3 加权快速合并算法快速合并算法仍然有他的局限性,因为查找根节点的次数并不是固定的,如果出现极端情况那么任然会出现计算较多的次数。假定输入对按照1-2, 2-3, 3-4, 4-5......的次序出现,然么N-1个数对形成的树为一条直线。其中N指向N-1,N-1指向N-2以此类推。要查找N最下面的节点,则需要N-1次遍历。那么查找M个对象的查找操作次数必定大于MN/2。原创 2022-05-27 10:48:41 · 184 阅读 · 0 评论 -
算法学习——1.连通性问题(一)
帮助通透理解典型问题-连通性问题的快速查找法,快速合并算法,学习数据结构与算法。原创 2022-05-26 20:53:20 · 504 阅读 · 0 评论 -
线性表:2.线性表的顺序存储结构--顺序表及C语言实现
逻辑结构上呈线性分布的数据元素在实际的物理存储结构中也同样相互之间紧挨着,这种存储结构称为线性表的顺序存储结构。也就是说,逻辑上具有线性关系的数据按照前后的次序全部存储在一整块连续的内存空间中,之间不存在空隙,这样的存储结构称为顺序存储结构。使用顺序存储结构存储的数据,第一个元素所在的地址就是这块存储空间的首地址。通过首地址,可以轻松访问到存储的所有的数据,只要首地址不丢,数据永远都能找着(一根绳...原创 2018-04-20 16:26:10 · 482 阅读 · 0 评论 -
线性表:4.结合顺序表和链表——静态链表及C语言实现
另外一种链式表示——静态链表,之前两篇说的都是动态表。逻辑结构上相邻的数据元素,存储在指定的一块内存空间中,数据元素只允许在这块内存空间中随机存放,这样的存储结构生成的链表称为静态链表。静态链表和动态链表的区别:静态链表限制了数据元素存放的位置范围;动态链表是整个内存空间。图1 静态链表的存储结构静态链表的构建方法静态链表使用数组这一数据类型预先申请足够大的内存空间。由于...原创 2018-07-16 19:17:34 · 675 阅读 · 0 评论 -
线性表:5.约瑟夫环,循环链表及其C语言实现
链表的使用,还可以把链表的两头连接,形成了一个环状链表,称为循环链表。和它名字的表意一样,只需要将表中最后一个结点的指针指向头结点,就形成了一个环。图1 循环链表循环链表和动态链表相比,唯一的不同就是循环链表首尾相连,其他都完全一样。实际应用:约瑟夫环问题约瑟夫环问题,是一个经典的循环链表问题,题意是:已知 n 个人(以编号1,2,3,…,n分别表示)围坐在一张圆桌周围,从编...原创 2018-07-16 19:21:15 · 1657 阅读 · 0 评论 -
线性表:6.双向链表,可构成双向循环链表和C语言实现
之前接触到的链表都只有一个指针,指向直接后继,整个链表只能单方向从表头访问到表尾,这种结构的链表统称为 “单向链表”或“单链表”。如果算法中需要频繁地找某结点的前趋结点,单链表的解决方式是遍历整个链表,增加算法的时间复杂度,影响整体效率。为了快速便捷地解决这类问题,在单向链表的基础上,给各个结点额外配备一个指针变量,用于指向每个结点的直接前趋元素。这样的链表被称为“双向链表”或者“双链表”。...原创 2018-07-17 08:55:58 · 619 阅读 · 0 评论 -
线性表:7.C语言链表实现俄罗斯轮盘赌小游戏
俄罗斯轮盘赌,想必很多人都听说过,一种残忍的赌博游戏。游戏的道具是一把左轮手枪,其规则也很简单:在左轮手枪中的 6 个弹槽中随意放入一颗或者多颗子弹,在任意旋转转轮之后,关上转轮。游戏的参加者轮流把手枪对着自己,扣动扳机:中枪或是怯场,即为输的一方;坚持到最后的即为胜者。 本节实践项目同轮盘赌类似,游戏规则:n 个参加者排成一个环,每次由主持向左轮手枪中装一颗子弹,并随机转动关上转轮,游...原创 2018-07-17 11:21:05 · 2120 阅读 · 1 评论 -
线性表:3.链表,单链表详解与C语言实现
逻辑结构上一个挨一个的数据,在实际存储时,并没有像顺序表那样也相互紧挨着。恰恰相反,数据随机分布在内存中的各个位置,这种存储结构称为线性表的链式存储。由于分散存储,为了能够体现出数据元素之间的逻辑关系,每个数据元素在存储的同时,要配备一个指针,用于指向它的直接后继元素,即每一个数据元素都指向下一个数据元素(最后一个指向NULL(空))。图1 链式存储存放数据如图1所示,当每一个数据元素都和它下一个...原创 2018-07-12 16:44:43 · 385 阅读 · 0 评论 -
栈和队列:1.栈(Stack)
栈,线性表的一种特殊的存储结构。与学习过的线性表的不同之处在于栈只能从表的固定一端对数据进行插入和删除操作,另一端是封死的。图1 栈结构示意图由于栈只有一边开口存取数据,称开口的那一端为“栈顶”,封死的那一端为“栈底”(类似于盛水的木桶,从哪进去的最后还得从哪出来)。栈的“先进后出”原则使用栈存储数据元素,对数据元素的“存”和“取”有严格的规定:数据按一定的顺序存储到栈中,当需...原创 2018-07-26 16:58:56 · 429 阅读 · 0 评论 -
栈和队列:2.队列(Queue)及其C语言实现
队列是线性表的一种,在操作数据元素时,和栈一样,有自己的规则:使用队列存取数据元素时,数据元素只能从表的一端进入队列,另一端出队列,如图1。图1 队列示意图称进入队列的一端为“队尾”;出队列的一端为“队头”。数据元素全部由队尾陆续进队列,由队头陆续出队列。队列的先进先出原则队列从一端存入数据,另一端调取数据的原则称为“先进先出”原则。(first in first out,简...原创 2018-08-10 14:26:00 · 1071 阅读 · 0 评论 -
字符串:1.存储结构
数据结构中提到的串,即字符串,由 n 个字符组成的一个整体( n >= 0 )。这 n 个字符可以由字母、数字或者其他字符组成。例如,S = ”BEIJING” ,S 代表这个串的串名,BEIJING 是串的值。双引号不是串的值,作用只是为了将串和其他结构区分开。特殊的串空串:含有零个字符的串。例如:S = “”(双引号中没有任何东西),一般直接用 Ø 表示。空格串:只包含空...原创 2018-08-24 15:31:13 · 804 阅读 · 0 评论 -
字符串:2.BF算法(普通模式匹配算法)
判断两个串之间是否存在主串与子串的关系,这个过程称为串的模式匹配。在串的模式匹配过程,子串 T 通常被叫做“模式串”。普通的模式匹配(“BF”算法)判断两个串是否存在子串与主串的关系,最直接的算法就是拿着模式串,去和主串从头到尾一一比对,这就是“BF”算法的实现思想。将提供的模式串(例如 “abcac” )从主串的第一个字符开始,依次判断相同位置的字符是否相等,如果全部相等,则匹配成...原创 2018-08-24 15:33:56 · 346 阅读 · 0 评论 -
字符串:3.KMP算法(快速模式匹配算法)详解
BF算法的改进——KMP算法(快速模式匹配算法)。串的普通模式匹配算法,大体思路是:模式串从主串的第一个字符开始匹配,每匹配失败,主串中记录匹配进度的指针 i 都要进行 i-j+1 的回退操作(这个过程称为“指针回溯”),同时模式串向后移动一个字符的位置。一次次的循环,直到匹配成功或者程序结束。"KMP"算法相比于"BF"算法,优势在于:在保证指针 i 不回溯的前提下,当匹配失败时,让...原创 2018-08-24 15:38:49 · 1348 阅读 · 0 评论 -
线性表:1.什么是线性表
线性表是数据结构中最简单的数据存储结构,可以理解为“线性的表”。线性,是说数据在逻辑结构上具有线性关系。将具有线性关系的数据存储到计算机中所使用的存储结构称为线性表。线性关系指的是数据一个挨着一个,总体呈线性分布。就好比“老鹰捉小鸡”游戏中,小鸡们全都手拉着手,它们之间的关系就可以称为线性关系。换句话说,线性表中的数据在逻辑结构上相互挨着(手牵手),中间没有空隙。每个数据元素,在它的前面可以找到唯...原创 2018-04-20 16:20:02 · 3110 阅读 · 0 评论 -
算法时间复杂度和空间复杂度的计算
算法,即解决问题的方法。同一个问题,使用不同的算法,虽然得到的结果相同,但是耗费的时间和资源是不同的。就比如要拧一个螺母,使用扳手还是钳子是有区别的,虽然使用钳子也能拧螺母,但是没有扳手好用。“条条大路通罗马”,解决问题的算法有多种,这就需要判断哪个算法“更好”。算法VS程序很多人误以为程序就是算法,其实不然:算法是解决某个问题的想法、思路;而程序是在心中有算法的前提下编写出来的可以运行的代码。例...原创 2018-04-13 16:39:39 · 612 阅读 · 0 评论 -
线性表的实现
栈的定义:栈是一种特殊的表这种表只在表头进行插入和删除操作。因此,表头对于栈来说具有特殊的意义,称为栈顶。相应地,表尾称为栈底。不含任何元素的栈称为空栈。 而本次给大家介绍用线性表实现的栈。如图这里介绍双向链表的常用操作:l 创建栈l 销毁栈l 清空栈l 压栈l 出栈转载 2017-05-25 16:43:20 · 259 阅读 · 0 评论 -
静态链表
用数组描述的链表,即称为静态链表,它的表现形式即为结构体数组,结构体变量包括数据域data和指针域next。这种存储结构,仍需要预先分配一个较大的空间,但在作为线性表的插入和删除操作时不需移动元素,仅需修改指针,故仍具有链式存储结构的主要优点。而且在不具有指针类型的高级语言中,无法使用指针类型,也就无法用指针实现单链表结构,所以静态链表是个不错的选择。 静态链表的定义为转载 2017-05-25 16:44:07 · 291 阅读 · 0 评论 -
数据结构和算法的选择
本部分总结前面介绍的数据结构和算法,并讨论在不同的情况下如何进行选择。通用数据结构:数组、链表、树、哈希表专用数据结构:栈、队列、优先级队列排序:插入排序、希尔排序、快速排序、归并排序、堆排序图:邻接矩阵、邻接表外部存储:顺序存储、索引文件、B-树、哈希方法1 通用数据结构转载 2017-05-17 23:05:49 · 289 阅读 · 0 评论 -
linux tree命令--显示目录的树形结构
看到有人PPT报告里,描述目录下的文件,用excel形式显示。有感而发,借此描述一下Linux的tree命令。 tree命令,是大小写敏感的。常用的是:tree -C颜色显示tree -f显示文件全路径tree -L 2只显示2层tree -P *.pl只显示文件目录和*.pl的perl文件。tree -F显示目录转载 2017-05-28 14:09:10 · 1291 阅读 · 0 评论 -
数据结构二叉树线索化
线索化二叉树指的是将二叉树中的结点进行逻辑意义上的“重排列”,使其可以线性的方式访问每一个结点。二叉树线索化之后每个结点都有一个线性下标,通过这个下标可以快速访问结点,而不需要遍历二叉树。 代码: [cpp] view plain cop转载 2017-05-30 22:28:11 · 275 阅读 · 0 评论 -
二叉树的链式结构
二叉树的链式结构2017-06-03 23:09 6人阅读 评论(0) 收藏 举报目录(?)[+]转自:http://www.cnblogs.com/MrSaver/p/6059918.html数据结构:二叉树的链式存储数据结构:二叉树的链式存储(C语言版) 1.写在前面 数组表示的优势和转载 2017-06-05 18:59:30 · 548 阅读 · 0 评论 -
数据结构之单链表
用一组地址任意的存储单元存放线性表中的数据元素,以元素(数据元素的映象) + 指针(指示后继元素存储位置)= 结点(表示数据元素 或 数据元素的映象),以“结点的序列”表示线性表称作线性链表(单链表)。 有几个基本概念需要掌握,如下: 1.表头结点 链表中的第一个结点,包含指向第一个数据元素的指针以及转载 2017-05-21 23:41:01 · 270 阅读 · 0 评论 -
深度优先搜索算法的通用解法
一、深度优先搜索深度优先搜索算法(Depth First Search),是图论中的经典算法。深度优先搜索算法是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当结点所有子结点那一层都被搜索过,再回溯返回到当前结点的邻结点,继续搜索,直到遍历完整棵树。一般采用的是前序遍历,先根然后再左右结点的方式进行。一些经典的问题,比如八皇后、马走日、迷宫等,都可以通过深度优先搜索转载 2017-05-08 14:45:27 · 587 阅读 · 0 评论 -
排序算法
排序的分类:内部排序和外部排序内部排序:数据记录在内存中进行排序外部排序:因排序的数据量大,需要内存和外存结合使用进行排序这里总结的八大排序是属于内部排序:当n比较大的时候,应采用时间复杂度为(nlog2n)的排序算法:快速排序、堆排序或归并排序。其中,快速排序是目前基于比较的内部排序中被认为最好的方法,当待排序的关键字是随机分布时,快速转载 2017-05-11 23:15:29 · 271 阅读 · 0 评论 -
十大算法简述
算法一:快速排序算法快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。快速排序使用分治法(Divide and conqu转载 2017-05-13 23:12:03 · 464 阅读 · 0 评论 -
快速排序算法
转自 快速排序算法 - 结构之法 算法之道 - 博客频道 - CSDN.NET http://blog.csdn.net/v_july_v/article/details/6116297一、快速排序算法的基本特性时间复杂度:O(n*lgn)最坏:O(n^2)空间复杂度:O(n*lgn)不稳定。快速排序是一种排序算转载 2017-05-25 16:46:37 · 333 阅读 · 0 评论 -
白话经典算法系列之九 从归并排序到数列的逆序数对(微软笔试题)
首先来看看原题 微软2010年笔试题在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序数对。一个排列中逆序的总数就称为这个排列的逆序数。如{2,4,3,1}中,2和1,4和3,4和1,3和1是逆序数对,因此整个数组的逆序数对个数为4,现在给定一数组,要求统计出该数组的逆序数对个数。 计算数列的逆序数对个数最简单的方便就最从前向后依次转载 2017-05-26 23:23:40 · 202 阅读 · 0 评论 -
数据结构与算法概述——C语言
数据结构是什么?数据结构,可以将之分为“数据”和“结构”两个方面去理解。数据,很好理解。都说人离不开空气,感觉剥夺实验告诉我们,人也离不开信息,而信息实际上就是对数据进行加工后得到的产物。信息的形式多样化,所以数据的形态也多种多样:文字、数字、字母、符号、图形图像、音频视频等都可以是数据。感觉剥夺实验,就是剥夺人的所有接受信息的权利,包括触觉、听觉、感觉等,这样的剥夺,任何人都是受不了的,详情可以...原创 2018-04-13 16:37:28 · 656 阅读 · 0 评论 -
树形结构
有根树的表示 表示链表的方法可以推广到任意同构的数据结构上,比如,分支有限制的有根树都可以用相似的范式表示。特别的有:二叉树T:具有属性p,left,right,指向父节点,左子节点,右子节点。T.root指向根节点。 该方法不适用的场景: ①分支无限制的有根树无法用上述方法表示。 ②如果树的孩子树限制在比较大的常数内,但是多数节点只有少量的孩子,会浪费大量存储资源。转载 2017-05-23 22:17:59 · 441 阅读 · 0 评论