随笔分类 - 数据结构
摘要:1.链表介绍 链表是有序的列表,但是它在内存中是存储如下: 小结上图: 链表是以节点的方式来存储,是链式存储 每个节点包含data域,next域:指向下一个节点. 如图:发现链表的各个节点不一定是连续存储. 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定 2.单链表的应用实例 使用带h
阅读全文
摘要:1.队列介绍 队列是一个有序列表,可以用数组或者链表来实现。 遵循先入先出的原则。即先存入队列的数据,要先取出。后存入的要后取出。 2.数组模拟队列思路 队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如上图,其中 maxSize是该队列的最大容量。 因为队列的输出、输入是分别
阅读全文
摘要:1.栈的一个实际需求 请输入一个表达式 计算式:[7*2*2-5+1-5+3-3] 请问: 计算机底层是如何运算得到结果的? 注意不是简单的把算式列出运算 计算机怎么理解这个算式的(对计算机而言,它接收到的就是一个字符串)->栈 2.栈的介绍 1)栈的英文为(stack) 2)栈是一个先入后出(FI
阅读全文
摘要:1.先看实际需求 编写的五子棋程序中,在存盘退出和续上盘的功能 分析问题: 因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据,那么该怎么解决呢?稀疏数组。 2.基本介绍 当一个数组中大多数元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。 稀疏数组的处理方法: 记录数组一
阅读全文
摘要:1.弗洛伊德(Floyd)算法介绍 1)和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名 2)弗洛伊德算法(Floyd)计算图中各个顶点之间的最短路
阅读全文
摘要:1.应用场景-最短路径问题 看一个应用场景和问题: 1)战争时期,胜利乡有7个村庄(A, B, C, D, E, F, G) ,现在有六个邮差,从G点出发,需要分别把邮件分别送到 A, B, C , D, E, F 六个村庄 2)各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里 3)
阅读全文
摘要:1.应用场景-公交站问题 1)某城市新增7个站点(A, B, C, D, E, F, G) ,现在需要修路把7个站点连通 2)各个站点的距离用边线表示(权) ,比如 A – B 距离 12公里 3)问:如何修路保证各个站点都能连通,并且总的修建公路总里程最短? 2.克鲁斯卡尔算法介绍 1)克鲁斯卡尔
阅读全文
摘要:1.应用场景-修路问题 看一个应用场景和问题: 1)有胜利乡有7个村庄(A, B, C, D, E, F, G) ,现在需要修路把7个村庄连通 2)各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里 3)问:如何修路保证各个村庄都能连通,并且总的修建公路总里程最短? 思路: 将10条边
阅读全文
摘要:1.应用场景-集合覆盖问题 假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号 2.贪心算法介绍 1)贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法
阅读全文
摘要:1.应用场景-字符串匹配问题 字符串匹配问题:: 1)有一个字符串 str1= ""算算法 算法你算 算法你算法你算你好"",和一个子串 str2="算法你算" 2)现在要判断 str1 是否含有 str2, 如果存在,就返回第一次出现的位置, 如果没有,则返回-1 2.暴力匹配算法 如果用暴力匹配
阅读全文
摘要:1.应用场景-背包问题 背包问题:有一个背包,容量为4磅 ,现有如下物品 1)要求达到的目标为装入的背包的总价值最大,并且重量不超出 2)要求装入的物品不能重复 2.动态规划算法介绍 1)动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取
阅读全文
摘要:1.分治算法介绍 1)分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序,傅立叶变换(
阅读全文
摘要:1.二分查找算法(非递归)介绍 我们讲过了二分查找算法,是使用递归的方式; 二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找 二分查找法的运行时间为对数时间O(㏒₂n),即查找到需要的目标位置最多只需要㏒₂n步,假设从[0,99]的队列(100个数,即n=100)
阅读全文
摘要:1.广度优先遍历基本思想 图的广度优先搜索(Broad First Search) 。 类似于一个分层搜索的过程,广度优先遍历需要使用一个队列以保持访问过的结点的顺序,以便按这个顺序来访问这些结点的邻接结点。 2.广度优先遍历算法步骤 1)访问初始结点v并标记结点v为已访问。 2)结点v入队列 3)
阅读全文
摘要:1.图遍历介绍 所谓图的遍历,即是对结点的访问。一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略: (1)深度优先遍历 (2)广度优先遍历 2.深度优先遍历基本思想 图的深度优先搜索(Depth First Search) 。 1)深度优先遍历,从初始访问结点出发,初始访问结
阅读全文
摘要:1.为什么要有图 1)线性表局限于一个直接前驱和一个直接后继的关系 2)树也只能有一个直接前驱也就是父节点 3)当我们需要表示多对多的关系时, 这里我们就用到了图 2.图的举例说明 图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点。如图: 3.图的
阅读全文
摘要:1.二叉树问题分析 二叉树的操作效率较高,但是也存在问题, 请看下面的二叉树 1)二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如1亿, 就存在如下问题 2)问题1:在构建二叉树时,需要多次进行i/o操作(海量数据存在数据库或文件中),节点海量,构建二叉树时,
阅读全文
摘要:1.为什么需要平衡二叉树? 二叉排序树可能的存在的问题 给你一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在. 上图BST存在的问题分析: 左子树全部为空,从形式上看,更像一个单链表。 插入速度没有影响 查询速度明显降低(因为需要依次比较), 不能发挥BST的优
阅读全文
摘要:1.为什么要用二叉排序树 使用数组 数组未排序,优点:直接在数组尾添加,速度快。 缺点:查找速度慢. 数组排序,优点:可以使用二分查找,查找速度快,缺点:为了保证数组有序,在添加新数据时,找到插入位置后,后面的数据需整体移动,速度慢。 使用链式存储-链表 不管链表是否有序,查找速度都慢,添加数据速度
阅读全文
摘要:1.基本介绍 赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。 赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在20%*~90%之间。 赫夫曼码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,称之为最佳编码。 2.原理剖析 1.定长编码 2.变长编码 3.赫夫曼编码
阅读全文