
数据结构和算法
文章平均质量分 94
简单介绍常用的数据结构,为之后的算法学习打下基础
杨天超
这个作者很懒,什么都没留下…
展开
-
常见算法思想之动态规划_贪婪算法
1.动态规划最近总是跟动态规划打交道,索性就将其弄明白一点。所谓的动态规划并不是一种具体的算法,而是一种算法的思想。思想总是抽象的,缥缈的。所以在学习动态规划的时候会有一种很尴尬的情况,就是感觉这个东西很简单,但是又不知道自己是不是真的学会了。简单的来说,动态规划就是将一个大问题分解为子问题,然后根据子问题的解求出原问题的解。它适用于有重复子问题(在问题计算的过程中,子问题要被重复计算多次)和最优子结构(原问题的最优解包含的子问题的解也是最优的)的问题。根据问题的这两个特征,我们很容易去简化这类问题:原创 2020-10-29 17:33:12 · 590 阅读 · 0 评论 -
常用数据结构之前缀树_线段树_树状数组
1.前缀树如下图所示,将单词拆分为字符,用从根节点到终点(黑色部分)所有路径上的字符来表示一个单词。如012用来表示in,0124用来表示int。这样将单词公共部分统一提取出来,节约存储空间,方便进行联想查找。常用在搜索引擎、输入法中的联想功能。2.前缀树python代码实现代码参考前缀树的python实现#File Name : 前缀树.pyclass TrieNode(object): def __init__(self): # 路过此节点的节点数,即以该路径为前缀的原创 2020-10-17 13:59:06 · 546 阅读 · 0 评论 -
常用数据结构之重连通图_拓扑排序_关键路径_最短路径
1.重连通图1.重连通图:在常用数据结构图这一篇中介绍过强连通图的概念,对于有向图任意两个节点A、B均符合从A到B有路径连通,从B到A也有路径连通,则称这样的有向图为强连通图。非强连通图中各自强连通的最大子图称为强连通分量。这里介绍点的重连通图概念有点像,重连通图指无向图中任意两个节点之间都有至少两条通路,称这样的无向图为重连通图。2.关节点/割点**:在无向图中,删除了某个顶点及其对应的边之后。原来的连通图被分割为二个及以上的连通分量,这样的顶点被叫做关节点/割点3.连通度:重连通图是没有关节点的,原创 2020-10-06 14:25:47 · 3676 阅读 · 0 评论 -
常用数据结构之图的深度优先搜索_广度优先搜索_生成树_普里姆算法_克鲁斯卡尔算法
1.图的基本概念前面我们聊到数据之间的关系有三种形式,一对一(线性表)、一对多(树),今天我们来聊聊第三种多对多的存储形式——图。下面第一幅图,顶点之间没有箭头,称为无向图;第二幅有箭头的称为有向图。如果从一个顶点出发,经过一定的路径后又回到自身,称为回环。图三中每条路径上面的数字称为权,带权的图称为网。如果两个顶点之间通过一定数量的路径连接,我们成为连通;如果图中任意两节点之间都是连通的,称图为连通图。如果有向图中任意两个节点A、B,从A到B至少有一条路径,从B到A也至少有一条路径,称这样的图为强联通图原创 2020-10-04 23:48:49 · 4021 阅读 · 1 评论 -
常用数据结构之树的双亲_孩子_孩子兄弟表示法
1.树的双亲表示法前面我们聊得都是二叉树,今天我们来讨论一下如何去表示一棵普通的树。常用的表示方法有三种:双亲表示法、孩子表示法和孩子兄弟表示法。我们首先来聊一下双亲表示法,顾名思义,双亲表示法就是在每一个节点中,存储其父节点的下标。这样就可以将树中各节点的结构关系表示出来,也可以快速的对父节点进行访问。如下图所示我们将一棵普通的树,用图二中的列表形式进行存储。具体的python实现代码,如下所示(个人手写,不喜勿怪):#-*- coding:utf-8 -*-class Node:原创 2020-10-03 17:35:11 · 7788 阅读 · 0 评论 -
常用数据结构之线索二叉树和哈夫曼树
1.线索二叉树 上一篇二叉树中,我们介绍了基本的二叉树的结构。每一个父节点对应两个子节点,左子节点和右子节点。其中我们会看到,很多节点的左右节点都为null,为了更高效的存储和遍历,我们考虑一种方式将这些为null的节点利用起来。这就是线索二叉树的思想,将为null的左子节点指向遍历时的前驱节点,为null的右子节点指向遍历时的后续节点。如此一来,在遍历的过程中,我们便可以直接通过左右子节点,找到叶子节点的前驱和后驱,使用一条线完整的将整刻树串起来。 ...原创 2020-10-02 18:15:15 · 576 阅读 · 0 评论 -
常用数据结构之二叉树及树的四种遍历方式
1.树 我们选择一种数据结构,不仅要能存储数据,而且要能体现数据之间的关系。目前数据主要有是三种关系一对一、一对多、多对多;之前我们讨论了线性表(数组、链表、栈、队列),其中的元素具有一对一的关系,通过元素之间左右相连来表达数据。为了表达具有一对多关系的数据,我们引进了树的概念。掌握树的关键就在于掌握这种不断延伸的一对多的关系。 下面我们介绍几种约定俗称的概念: ...原创 2020-09-28 23:07:05 · 1949 阅读 · 0 评论 -
常用数据结构之Queue(队列)
1.定义 接着上一篇常用数据结构之栈,我们趁热打铁,今天来聊一聊队列。我们都知道栈是一种有限制的线性表,只能从顶部入顶部出,即后进先出。队列是一种和栈非常相似的数据结构,也是一种有限制的线性表。其限制条件是FIFO(先进先出),就好像我们平时排队一样,新来的人需要排在队尾,排在最前面的人最先上车。 2.顺序队列代码实现 我们使用python列表来实现一个简单的队列,包括入队,出队;这里每次出队的时候直接取第一个位置,然后其它的元素一次往...原创 2020-09-25 16:20:49 · 616 阅读 · 0 评论 -
常用数据结构之Stack(栈)
1.理论介绍 上一篇中我们介绍了数据结构中的堆,常言道堆栈不分家,我们继续来聊聊栈这种数据结构吧。栈从本质上来讲是一种有着特殊要求的线性表,感兴趣的可以了解一下之前讲的数据结构中的线性表。既然是线性表那么其就有两种形式,一种是线性存储(像数组一样是一块连续的内存空间),另外一种是链式存储(像链表一样是一段非连续的空间); 栈的特殊要求就是LIFO(Last In First Out),对,后进先出。只有栈顶的元素允许访问。还记得上一篇讲的堆吗?从本质上来讲堆也是只有顶部的...原创 2020-09-24 21:17:43 · 653 阅读 · 1 评论 -
常用数据结构之Heap(堆)
1.简介 接着上一篇数组和链表,我们今天来聊一聊堆。我们都知道在操作系统中有堆栈这一概念,学过java的同学都知道java虚拟机中也有堆栈这么一说。栈负责管理函数的上下文以及一些基本类型变量,这一块由系统管理。堆存放新建的对象,并且会将其地址指向栈中的一个引用变量。如果没有任何引用,对象就成为垃圾对象,最后由垃圾回收器回收。但是我这里要聊的并不是内存中的堆,内存一般使用链表的形式来管理。但数据结构中堆的概念,相当于一种优先队列。2.堆的定义和性质 1.定义 ...原创 2020-09-24 18:39:49 · 1158 阅读 · 0 评论 -
常用数据结构之数组和链表
1.概述 程序在计算机中运行,实际上就是数据的流动。简单的说就是从一个容器到另外一个容器,数据对应的是两种操作存和取。所以对于数据结构的选择,我们最基本的要求就是能装的下,然后就是存取更加的方便。比如买菜就要用篮子,打水就要用水桶,给我们的数据选择合适的容器也是同等的重要。数据结构和算法可以称得上程序员之所以为程序员的东西,我尝试这尽量把这门数据结构说的容易一些,加油!奥利给。1.线性表 线性表是一种数据存储的概念,其核心的思想是把元素一个个的串起...原创 2020-09-18 22:36:07 · 631 阅读 · 0 评论