
数据结构和算法
文章平均质量分 58
略略略
Chris_Chris_
梦想架构师
展开
-
字符串匹配算法
BF(Brute Force)算法:暴力匹配字符串A为主串,字符串B为模式串A串从第0位开始,截取B长度的字符串,然后跟B串比较,不匹配的话+1从第1位截取B长度的字符串再比较。。。一直到超过长度A=HelloWorldB=Workd第一次截取到Hello和World比较,不匹配第二次截取到elloW和world比较,不匹配第三次截取到lloWo。。。。。。。代码实现public class Bfalth { public static boolean isMatch(Stri原创 2021-07-15 22:01:25 · 144 阅读 · 1 评论 -
排序算法-桶排序
先创建若干个桶,每个桶存放不同范围的数据桶和桶之间的跨度=(数据最大值-数据最小值)/ (桶的数量 - 1)假设有一个数组:1.2,0.5,4.5,2.6,2.7这里如果桶数量等于原始数列的元素数量跨度=(4.5-0.5)/(5-1)=1然后将数据投入对应的桶中再对桶内的数据排序代码实现public class BucketSort { public static double[] bucketSort(double[] array) { double max原创 2021-07-08 20:24:11 · 108 阅读 · 0 评论 -
排序算法-堆排序
堆是一个完全二叉树堆排序是指利用堆这种数据结构所设计的一种排序算法大顶堆:每个结点的值都大于或等于其左右孩子结点的值arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]小顶堆:每个结点的值都小于或等于其左右孩子结点的值arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]堆排序的基本思想是:将待排序序列构造成一个大顶堆(小顶堆同理),此时,整个序列的最大值就是堆顶的根节点。原创 2021-07-07 22:27:27 · 132 阅读 · 1 评论 -
排序算法-快速排序
快速排序在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成两个部分,然后分别对这两个部分再排序。双边排序法先选定基准元素pivot,然后设置两个指针left和right,指向数列的最左和最右两个元素,目标是把比pivot小的放到左边,把比pivot大的放到右边第一次循环从right指针开始,让指针所指向的元素和基准元素做比较。如果大于或等于pivot,则指针向左移动,如果小于pivot,则right指针停止移动,切换到left指针轮到l原创 2021-07-05 23:15:32 · 127 阅读 · 1 评论 -
数据结构-二叉堆
二叉堆是一种完全二叉树(除最后一层外,其它各层的结点数都达到最大个数,最后一层所有的结点都连续集中在最左边)大顶堆任何一个父节点的值,都大于或等于它左、右孩子节点的值小顶堆任何一个父节点的值,都小于或等于它左、右孩子节点的值存储方式:二叉堆可以使用数组来储存,如果数组从第1位开始存,数组中下标为 i 的节点的左子节点,就是下标为 i∗2 的节点,右子节点就是下标为 i∗2+1 的节点,父节点就是下标为 i/2 取整的节点如果数组从第0位开始存,数组中下标为 i 的节点的左子节点,就是原创 2021-07-01 23:07:38 · 140 阅读 · 1 评论 -
数据结构-多路查找树
多路查找树:每一个节点的子节点数可以多于两个,而且每个节点可以存储多个元素B树B树即B-tree树,是对二叉查找树的改进。B树中所有节点的孩子节点数中的最大值称为B树的阶B树的特性:如果指定了B树的阶为M,那么这个树中任何节点的子节点数量都不能超过M除根节点和叶节点外,所有点至少有m/2棵子树每个节点可以放M/2-1~M-1个数量的key非叶子结点的key个数=指向子节点的指针个数-1如图point1指向的子节点的所有data(data3,data4,data5)小于data1,poin原创 2021-07-01 22:31:41 · 89 阅读 · 0 评论 -
红黑树基本知识与实现
二叉查找树:如果左子树不为空,则左子树上的所有节点的值都小于根节点的值,如果右子树不为空则右子树的所有节点都大于根节点。极端的情况下二叉查找树的子节点集中在树的一边,导致二叉树变成了链表,失去了二叉树的查询优势,查询的效率下降红黑树:自平衡的二叉查找树红黑树的特点:根节点是黑色每个叶子节点都是黑色空节点(一般会把空的叶子节点省略掉)红色父节点的子节点必须是黑色(父子不能都为红)从任一结点到其每个叶子的所有路径都包含相同数目的黑色结点(平衡的关键)新插入节点默认为红色,插入后需要校验红黑原创 2021-06-27 02:19:53 · 99 阅读 · 1 评论 -
数据结构-散列表
散列表(哈希表)提供了键(Key)和值(Value)的映射关系。只要给出一个Key,就可以高效查找到它所匹配的Value,时间复杂度接近于O(1)散列表在本质上也是一个数组,通过hash函数把Key和数组下标进行转换,是把任意长度的输入通过散列算法转换成固定类型、固定长度的散列值,根据散列值在数组上找到下标。比如://数组下标=取key的hashcode模数组的长度后的余数index = Math.abs(HashCode (Key))% Array.lengthHash冲突(碰撞):数组的原创 2021-06-22 22:28:24 · 187 阅读 · 2 评论 -
数据结构-线性表
数组数组是有限个相同类型的变量所组成的有序集合数组用一组连续的内存空间来存储一组具有相同类型的数据橙色格子:被使用的内存白色格子:空闲的内存蓝色格子:数组占用的内存数组可以根据下标随机访问数据(根据下标读取元素的方式叫作随机读取)比如一个int数组array[ ],int是4字节(32位),实际内存存储是位那么array[i]的地址为array[i]_address=array[0]_address+i*4优点:数组拥有非常高效的随机访问能力,只要给出下标,就可以用常量时间(O(原创 2021-06-21 22:54:31 · 90 阅读 · 0 评论 -
算法复杂度
时间复杂度大O复杂度表示法:int sum(int n){ int s=0; //t: 一行代码一个执行单位 int i=1; //t for(;i<=n;i++){ //t*n s=s+i; //t*n } return s; //t}这段代码的总时间就是t+t+nt+nt+t=2n*t+3t即执行时间T(n)与执行次数成正比T(n)=O(f(n))T(n): 代码执行时间n:数据规模f原创 2021-06-18 21:59:40 · 491 阅读 · 0 评论