随笔分类 - 数据结构与算法
摘要:深度优先搜索算法(Depth-First-Search,DFS)是一种图的搜索算法,它遍历或者搜索树、图,沿着一条路或者一个分支一路遍历下去,直到最深的分支节点或者路的尽头,再往回回溯,遍历其他的分支或者其他路,直到找到目标为止。 遍历一课树的流程,从顶点a先遍历左节点b,再往b的左节点d遍历,节点
阅读全文
摘要:什么是二分查找 二分查找又称作折半搜索算法,是一种在有序数组中查找某一个特定元素的搜索算法;二分查找的平局时间复杂度为O(logn)。 根据实际问题来讲解二分查找 问题1:查找有序递增数组中的特定元素 查找有序递增数组中的某一个数; 从有序递增数组的中间开始,如果中间的数值刚好是要查找的数,搜索就结
阅读全文
摘要:堆排序 堆排序是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子节点的键值或索引总是小于(或者大于)它的父节点,堆排序的时间复杂度为O(nlogn)。(来自维基百科) 什么是堆 堆是一种特殊的完全二叉树,它的性质为:任意节点大于等于或者小于等于它的左右
阅读全文
摘要:归并排序的核心思想是使用分治的策略来进行排序。分治是将大问题分成一些小问题,小问题解决后在合并在一起。 我们来看一下这一排数据:9,4,5,1,2,7,3,8,6,0。算法流程大概就是以下图所示,将数组拆分,然后每一个小数组进行排序合并。 再看一下局部的两个小数组如何进行合并的,进行合并的两个红色数
阅读全文
摘要:1.什么是递归 举一个例子:大学军训的时候,一个队伍,开头的人A想知道这个队伍一共有多少人,但是每个人只能通过旁边的交流,那如何统计呢? 我们可以先找出最后一个人,A可以问旁边的人B是否为最后一个人,B又问下一个人,如此类推,等到了最后一个人,再将号码返回到第一个人A,每往前一个,号码上就+1,第一
阅读全文
摘要:存储结构: 数组是一块连续的内存空间存储的,然而链表是零散的内存空间存储的。 链表在插入和删除操作比数组高效,时间复杂度仅为O(1),链表不是使用连续的内存空间,所以可以充分利用零散的内存空间。 链表结构: 1. 单向链表 2. 双向链表 现在最常见的链表结构: 单向链表、双向链表,下面说一下这几种
阅读全文
摘要:在顺序队列出队列的时候,数组前面会有空余的空间,我们可以将数据往前搬移,提高空余空间的使用,但是效率比较低;我们可以使用循环队列来提高效率。 Head代表队列头,Tail代表队列尾,n代表队列的长度,如果Head与Tail大于等于n的时候就是到了循环点,可以将Head或者Tail余n来代表当前n内的
阅读全文
摘要:原理: 队列的操作原理是先进先出,后进后出;队列也是一种运算受限的线性表,从队列的头部出列,从队列的尾部入列。 队列基本用法: empty():如果队列为空返回true,否则返回false size():返回队列中元素的个数 pop():删除队列首元素但不返回其值 front():返回队首元素的值,
阅读全文
摘要:1.栈的原理 后进先出(LIFO-last in first out):最后插入的元素最先出来,是一种“操作受限”的线性表,只允许在端插入和删除数据 2.栈的实现 顺序栈:用数组实现,顺序栈需要动态扩容,在初始化时需要给定一个固定大小的数组,当栈大于固定大小时需要扩充数组的大小。 链式栈:用链表实现
阅读全文
摘要:数组是由相同类型的元素(element)的集合所组成的数据结构,分配一块连续的内存来存储。利用元素的索引(index)可以计算出该元素对应的存储地址。(维基百科) 1. 存储结构 数组是线性表数据结构,定义数组时,系统会分配一份连续的内存空间来存储一组相同的类型的数据,如int num[n]; 2.
阅读全文

浙公网安备 33010602011771号