数据结构和算法
数据结构和算法
IT_10-
我爱编程 编程爱我❤️
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
字符串匹配算法(BF、RK、KMP)
字符串匹配问题描述:给定主串str1,模式串str2,在str1找查找str2子串第一次出现的位置,如果存再,则返回str2在str1中第一次的下标,否则返回-1。BF算法全称Brute Force算法,即暴力匹配算法。在主串中,检查起始位置分别是0、1、2…n-m且长度为m的n-m+1个子串,看有没有跟模式串匹配的。/** * @param str1 主串 * @param st...原创 2020-03-15 10:35:58 · 993 阅读 · 0 评论 -
树---B树、B+树、B*树
B树B树(也称B-tree,B-树)特点:B树的阶:节点的最多子节点个数B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的子结点;重复,直到所对应的子指针为空,或已经是叶子结点关键字集合分布在整颗树中, 即叶子节点和非叶子节点都存放数据搜索有可能在非叶子结点结束其搜索性能等价于在关键字全集内做一次二分查找B+树B...原创 2020-03-04 16:03:15 · 504 阅读 · 0 评论 -
树---赫夫曼树
赫夫曼树几个概念:路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。结点的权及带权路径长度:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。树的带权路径长度:树的带权...原创 2020-02-22 09:21:19 · 309 阅读 · 0 评论 -
树---二叉树、顺序存储二叉树、线索化二叉树、二叉搜索树(BST)、平衡二叉树(AVL)
树树形结构:每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树;关于树形结构中的一些术语:节点的高度=节点到叶子节点的最长路径(边数)节点的深度=根节点到这个节点所经历的边的个数节点的层数=节点的深度+1树的高度=根节点的高度二叉树每个节点最多有两个子节点满二叉树:一棵二叉树...原创 2020-02-20 17:11:08 · 1187 阅读 · 0 评论 -
查找---二分查找的三种实现和插值查找
二分查找递归实现区间为左闭右闭区间为左闭右开public class BinarySearchTest { public static void main(String[] args) { int[] arr = {1,2,3,4,5}; int index1 = binarySearch1(arr, 5); System.out...原创 2020-02-18 22:19:24 · 351 阅读 · 0 评论 -
排序算法实现和性能分析
排序算法冒泡排序选择排序插入排序希尔排序快速排序归并排序基数排序性能排序算法最好时间复杂度最坏时间复杂度平均时间复杂度空间复杂度稳定性冒泡排序O(n)O(n^ 2)O(n^2)O(1)稳定选择排序O(n^ 2)O(n^ 2)O(n^2)O(1)不稳定插入排序O(n)O(n^ 2)O(n^2)O(1)稳定希...原创 2020-02-16 15:39:21 · 555 阅读 · 0 评论 -
排序---基数排序实现和性能分析
基数排序算法思想将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用。图解将数组 {53, 3, 542, 748, 14, 214} 使用基数排序, 进行升序排序事先准备10个数组(10个桶), 0...原创 2020-02-16 12:41:54 · 563 阅读 · 0 评论 -
排序---希尔排序实现和性能分析
希尔排序希尔排序是简单插入排序的改进,直接插入排序的最坏情况时间复杂度达到O(n^2),比如从大到小的一串数字654321,使用插入排序从小到大进行排序,这就达到插入排序的最坏情况。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。示意图(1)对下面这组数据进行从小到大排序(n...原创 2020-02-15 19:51:37 · 862 阅读 · 0 评论 -
栈---中缀表达式转后缀表达式画图详解和代码实现
中缀表达式转后缀表达式思路步骤分析:1 初始化两个栈:运算符栈s1和存储中间结果的栈s22 从左至右扫描中缀表达式3 遇到运算符时,比较其与s1栈顶运算符的优先级3.1 如果s1为空,或栈顶运算符为左括号’(’,则直接将此运算符入栈;3.2 否则,如果优先级比栈顶运算符的高,也直接将此运算符入栈;3.3 否则,将s1栈顶的运算符弹出并压入s2中。然后又从3.1步开始进行比较(此时带入...原创 2020-02-11 18:06:16 · 3392 阅读 · 0 评论 -
单链表---约瑟夫环问题
分析:比如由5个节点组成一个环,从第1个节点开始报数,每报数2个节点删除一个节点,单链表如下:(1)设置一个helper辅助节点,指向最后一个节点:(2)因为是从第k个节点开始报数,因此先让first和helper走k-1步,这样first节点就指向报数的第一个节点了,k初始值为1,因此不用向前走(3)然后开始删除节点,每次让helper和first向前走1步,走了m-1步支行,fir...原创 2020-02-10 20:10:00 · 416 阅读 · 0 评论 -
跳跃表
简介如果我们要实现按照成绩对学生进行排名,可以选择数组、链表、平衡树或红黑树来实现,数组的插入和删除效率低,链表查询的效率低,平衡树或红黑树虽然效率高但是实现复杂。跳跃表(后面简称跳表)就是一种改造了链表,有点像“二分”查找的结构。下图是一个有序链表:如果将有序链表的部分节点分层,每层都是一个有序链表。查找时优先从最高层开始向后查找,当到达某节点时,如果next节点值大于要查找的值或nex...原创 2019-12-27 23:27:27 · 333 阅读 · 0 评论 -
散列表
散列表散列表又称为哈希表,英文“Hash Table”。散列表思想利用的是数组支持按照下标随机访问数据的特性。散列函数:通过key,计算出value,value就是表示将数据放入数组的那个位置。哈希冲突:不同的key,可能会得到相同的value,这是就产生了哈希冲突。解决哈希冲突可以使用开放寻址法(线性探测、二次探测、双散列等)或者链地址法来解决。装载因子:装载因子 = 散列表中...原创 2019-12-26 21:49:55 · 763 阅读 · 0 评论 -
排序---归并排序、快速排序、堆排序实现和性能分析
/** * @param $arr array 待排序的数组 * @param $l int 数组第一个元素下标索引 * @param $r int 数组最后一个元素下标索引 * @return array */function mergeSort($arr, $l, $r) { if ($l >= $r) return [$arr[$r]]; $mid = i...原创 2019-12-01 14:41:26 · 641 阅读 · 0 评论 -
排序---冒泡排序、选择排序、插入排序实现和性能分析
<?php//冒泡排序function bubbleSort(&$arr) { $len = count($arr); for($i = 0; $i < $len; $i++) { $flag = true; for($j = 0; $j < $len - $i - 1; $j++) { if($...原创 2019-11-30 19:57:32 · 576 阅读 · 0 评论 -
递归---从台阶问题学习递归、递归优化和非递归
递归就是将大问题划分为若干个子问题,各个问题是嵌套关系,最小的那个问题的结果是已知的,大问题不断分解直到达到最小问题的过程叫做“递”,小问题的解释已知的,然后根据这个解回过去求大问题的解的过程叫做“归”。最简单的递归的例子就是求n的阶乘:其递推公式为:f(n) = n * f(n-1),其中,f(1) = 1递归需要满足三个条件一个问题的解可以分解为几个子问题这个问题与分解之后的子...原创 2019-11-27 23:22:56 · 443 阅读 · 0 评论
分享