
大白话讲数据结构和算法
文章平均质量分 88
Halosec_Wei
该博主主攻python数据分析,数据挖掘,机器学习方向
展开
-
大白话讲数据结构和算法__01 绪论
前言数据结构和算法这门计算机必修课历来无论在哪个学校,都是无比乏味和催人入睡的。但是数据结构对于程序员来说是特别重要的。数据结构和算法这是一门不太容易学好的课程,因为这门课程比较搞脑子。虽然这门课程不太好学,但如果你想让自己的编程能力有质的飞跃,不再停留于调用现成的东西而是追求更完美的实现,那么这是你的必修课!如果你的目的是为了考计算机、软件方面的研究生,那么这门必考课现在就值得你...原创 2018-07-23 23:15:27 · 844 阅读 · 0 评论 -
大白话讲数据结构和算法__09 线性表的链式存储结构:循环链表
对于单链表,由于每个结点只存储了向后的指针,到了尾部标识就停止了向后链的操作。也就是说,按照这样的方式,只能索引后继结点不能索引前驱结点。这样的话,如果不从头结点出发,就无法访问到全部结点。事实上要解决这个问题也并不麻烦,只需要将单链表中终端结点的指针端由空指针改为指向头结点,问题就结了。将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表成...原创 2018-08-07 16:05:10 · 225 阅读 · 0 评论 -
大白话讲数据结构和算法__番外 约瑟夫问题的循环链表实现
著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,...原创 2018-08-07 16:21:25 · 229 阅读 · 0 评论 -
关于循环列表特点的一点思考:头指针首发变更为尾指针
在单链表中,我们有了头结点时,我们可以用O(1)的时间访问第一个结点,但对于要访问最后一个结点,我们必须要挨个向下索引,所以需要O(n)的时间。用O(1)的时间就可以由链表指针访问到最后一个结点。不过我们需要改造一下现有的循环链表,我们不用头指针,而是用指向终端结点的尾指针来表示循环链表,此时查找开始结点和终端结点都很方便了如图所示,这样,我们把尾指针代替头节点作为首发指针,就能可使得...原创 2018-08-07 23:24:27 · 2693 阅读 · 0 评论 -
大白话讲数据结构和算法__番外 魔术师发牌问题的循环链表实现
问题描述:魔术师手里一共有13张牌,全是黑桃,1~13.魔术师需要实现一个魔术:这是十三张牌全部放在桌面上(正面向下),第一次摸出第一张,是1,翻过来放在桌面上。第二次摸出从上往下数第二张,是2,翻过来 放在桌面上,(第一张放在最下面去,等会儿再摸),第三次摸出从上往下数第三张,是3,翻过来放在桌面上,(第一张和第二张 放在最下面去,等会儿再摸)以此类推 最后一张就是13...原创 2018-08-08 14:55:03 · 288 阅读 · 0 评论 -
双向链表实现:输入一个数使得26个字母的排列发生变化
题目:要求实现用户输入一个数使得26个字母的排列发生变化,例如用户输入3,输出结果:DEFGHIJKLMNOPQRSTUVWXYZABC同时需要支持负数,例如用户输入-3,输出结果:XYZABCDEFGHIJKLMNOPQRSTUVW 代码演示如下:#include <stdio.h>#include <stdlib.h>#define OK 1...原创 2018-08-08 23:40:24 · 1154 阅读 · 2 评论 -
大白话讲数据结构和算法__10 线性表的链式存储结构:双向链表
例如我们的火车刚发明的时候是只有一个“头”的,所以如果它走的线路是如下:A->B->C->D->E->F->G->H->I->J->K->L->A假设这会儿火车正停在K处呢,要他送一批货到J处,那么它将走的路线是:K->L->A->B->C->D->E-原创 2018-08-08 23:41:13 · 225 阅读 · 0 评论 -
栈的顺序存储结构的实例:2进制转10进制
题目:输入一个2进制,转化得到10进制 分析如下:二进制数是计算机数据的存储形式,它是由一串0和1组成的,每个二进制数转换成相应的十进制数方法如下:由于栈具有后进先出的特性,例如我们输入11001001这样的二进制数,如图:(top) 1 0 0 1 0 0 ...原创 2018-09-24 17:50:42 · 438 阅读 · 0 评论 -
大白话讲数据结构和算法__12 链栈与逆波兰表达式(后缀表达式)
栈的链式存储结构其实就是用指针来指向栈的下一个元素栈因为只是栈顶来做插入和删除操作,所以比较好的方法就是将栈顶放在单链表的头部,栈顶指针和单链表的头指针合二为一。栈的抽象数据结构(ADP)如下所示:teypedef struct StackNode{ElemType data; // 存放栈的数据struct StackNode *next;} StackNode, *L...原创 2018-09-25 20:35:53 · 315 阅读 · 0 评论 -
C语言中typedef struct和struct的区别:
typedef struct CLinkList{ int data; struct CLinkList *next;}node;上面的CLinkList是标识符,node是变量类型(相当于(int,char等))。 这语句实际上完成两个操作:1) 定义一个新的结构类型struct CLinkList{ int data; s...原创 2018-08-06 23:35:19 · 7620 阅读 · 1 评论 -
大白话讲数据结构和算法__番外 快速找到未知长度单链表的中间节点 (腾讯面试题)
题目:快速找到未知长度单链表的中间节点。既然是面试题就一定有普通方法和高级方法,而高级方法无疑会让面试官大大加分!普通的方法很简单,首先遍历一遍单链表以确定单链表的长度L。然后再次从头节点出发循环L/2次找到单链表的中间节点。算法复杂度为:O(L+L/2)=O(3L/2)。能否再优化一下这个时间复杂度呢?有一个很巧妙的方法:利用快慢指针!利用快慢指针原理:设置两个指针*search、*...原创 2018-08-06 17:37:34 · 291 阅读 · 0 评论 -
大白话讲数据结构和算法__08 线性表的链式存储结构:静态链表
我们知道C语言魅力在于指针的灵活性,使得它可以非常容易地操作内存中的地址和数据,这比其他高级语言更加灵活方便。面向对象使用对象引用机制间接地实现了指针的某些功能但是早期计算机科学家并没有java,c这些高级语言,只有原始的Basic,Fortran等早期的编程语言这些语言没有类似于C的指针功能,但是他们又想描述单链表,就没法实现了,怎么办呢?于是有人想出了用数组代替指针来描述单链表。...原创 2018-08-06 16:33:17 · 267 阅读 · 0 评论 -
大白话讲数据结构和算法__02 算法与数据结构的关系
算法,百度上面是这样解释的:算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡...原创 2018-07-24 14:00:06 · 526 阅读 · 0 评论 -
大白话讲数据结构和算法__03 算法的时间复杂度与空间复杂度(理论与计算)
算法效率的度量方法(建议看一下)在上一讲中,我们说到设计算法要尽量的提高效率,这里效率高一般指的是算法的执行时间那么我们如何来度量一个算法的执行时间呢?事后统计方法:这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。比较容易想到的方法就是我们把算法跑若干次,然后拿个“计时器”在旁边计时。这种事后统计方法看上去的确不...原创 2018-07-25 00:13:27 · 409 阅读 · 0 评论 -
大白话讲数据结构和算法__番外 线性表的一些抽象数据类型
InitList(*L): 初始化操作,建立一个空的线性表L。ListEmpty(L): 判断线性表是否为空表,若线性表为空,返回true,否则返回false。ClearList(*L): 将线性表清空。GetElem(L,i,*e): 将线性表L中的第i个位置元素值返回给e。LocateElem(L,e): 在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号...原创 2018-08-04 12:24:29 · 257 阅读 · 0 评论 -
大白话讲数据结构和算法__05线性表的定义与抽象数据类型
线性表线性表(List):由零个或多个数据元素组成的有限序列。这里需要强调几个关键的地方:首先它是一个序列,也就是说元素之间是有个先来后到的。若元素存在多个,则第一个元素无前驱,而最后一个元素无后继,其他元素都有且只有一个前驱和后继。另外,线性表强调是有限的,事实上无论计算机发展到多强大,它所处理的元素都是有限的。如果用数学语言来进行定义,可如下:若将线性表记为(a1,…,ai-...原创 2018-08-04 17:27:17 · 427 阅读 · 0 评论 -
大白话讲数据结构和算法__04 C语言 结构体 与结构体指针
这里的话因为接下来讲线性表之类需要用到C语言的结构体指针因此,这一讲将对结构体指针进行一个讲解 1,指针指针是C语言中的一个重要的概念,也是C语言的一个重要特色。正确而灵活地运用它,可以有效地表示复杂的数据结构;能动态分配内存;能方便地使用字符串;有效而方便地使用数组……掌握指针的应用,可以使程序简洁、紧凑、高效。很多人说指针很难确实,但是指针难的不是其定义,而是其用法...原创 2018-07-27 21:18:21 · 393 阅读 · 0 评论 -
大白话讲数据结构和算法__11 栈的顺序存储结构定义与插入,删除等操作
栈的定义栈是一种重要的线性结构,可以这样讲,栈是线性表的一种具体形式。例如,我们浏览网页,点击后退,我们不会直接返回第一个界面,而是上一个页面,这种后进先出的数据结构就是栈,栈应用是非常广泛的。例如我们Word,Photoshop等的“撤销”功能也是如此。再例如我们C语言的函数,也是利用栈的基本原理实现的。官方定义:栈(Stack)是一个后进先出(Last in first out,L...原创 2018-08-09 17:04:34 · 530 阅读 · 0 评论 -
大白话讲数据结构和算法__06 线性表的顺序存储结构
线性表有两种物理存储结构:顺序存储结构和链式存储结构。线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。线性表(a1,a2,…,an)的顺序存储如下: a1 a2 a3 a4 … ai-1 ai ...原创 2018-08-05 20:20:39 · 316 阅读 · 0 评论 -
大白话讲数据结构和算法__07 线性表的链式存储结构:单链表
第6节我们讲的线性表的顺序存储结构,它最大的缺点就是插入和删除时需要移动大量元素,这显然就需要耗费时间。那我们能不能针对这个缺陷或者说遗憾提出解决的方法呢?要解决这个问题,我们就得考虑一下导致这个问题的原因!为什么当插入和删除时,就要移动大量的元素?原因就在于相邻两元素的存储位置也具有邻居关系,它们在内存中的位置是紧挨着的,中间没有间隙,当然就无法快速插入和删除。我们有以下几种思路...原创 2018-08-06 15:16:38 · 416 阅读 · 0 评论 -
利用栈实现:中缀表达式转后缀表达式
题目:现有中缀表达式如:1+(2-3)*4+10/5请用栈的特性编写一个程序,使得程序输出后缀表达式分析如下:STEP1:1+(2-3)*4+10/5首先遇到第一个输入是数字1,数字在后缀表达式中都是直接输出,接着是符号“+”,入栈:STEP2:1+(2-3)*4+10/5第三个字符是“(”,依然是符号,入栈,接着是数字2,输出,然后是符号“-”,入栈:ST...原创 2018-09-26 20:50:59 · 34946 阅读 · 11 评论