数据结构与算法
文章平均质量分 60
草莓味的狮子座leo
这个作者很懒,什么都没留下…
展开
-
快速排序详解
原理快速排序是在冒泡排序上的改进,冒泡排序每次只比较相邻的两个元素,而快速排序每次交换是跳跃式的,首先选择一个基准数base(通常选择第一个元素),将小于等于base的数据全部置于左边,将大于等于base的数据全部置于右边时间复杂度 O(nlog 2n)代码实现// 每一轮快排 都将数据分为两部分public void quickSort(int[] arr,int right.int left){ int base =array[left]; int i = left; int j原创 2021-06-28 15:07:23 · 103 阅读 · 0 评论 -
B树和B+树
平衡二叉树定义二叉树的任意一个节点的左右两个子树的高度相差不能大于1(完全二叉树、满二叉树其实就是平衡二叉树)非完全可能也是平衡二叉树多路查找树多路查找树(multi-way search tree),其每一个结点的孩子数可以多于两个,且每一个结点处可以存储多个元素。一、B树B树是一种平衡的多路查找树,结点最大的孩子数目称为B树的阶描述一棵B树时需要指定它的阶树,阶树表示了一个结点最多有多少个孩子数目,一般用m表示举例:有一个5阶的B树,根节点数量范围 1 <=原创 2021-03-11 10:33:27 · 366 阅读 · 0 评论 -
栈的表示和实现
栈是先进后出的数据结构,是线性表顺序存储结构利用一组地址连续的存储单元一次存放自栈底到栈顶的数据元素top指针,栈顶元素base:栈底元素stacksize:栈的最大容量空栈: base = top栈满: top-base == stacksize链式存储结构只能在链表头部 进行操作链表的头指针就是栈顶,不需要头节点栈和递归分治法:复杂问题分解成几个相对简单的子问题...原创 2021-03-10 16:04:45 · 433 阅读 · 0 评论 -
有序表的合并
一、顺序表实现二、单链表实现原创 2021-03-10 15:27:17 · 132 阅读 · 0 评论 -
二叉树
树(Tree)B、C、D 这三个节点的父节点是同一个节点,所以它们之间互称为兄弟节点。E没有父节点的节点叫做根节点。没有子节点的节点叫做叶子节点或者叶节点,比如图中的 G、H、I、J、K、L 都是叶子节点。二叉树 (Binary Tree)每个节点最多有两个“叉”,也就是两个子节点,分别是左子节点和右子节点编号 2 的二叉树中,叶子节点全都在最底层,除了叶子节点之外,每个节点都有左右两个子节点,这种二叉树就叫做满二叉树编号 3 的二叉树中,叶子节点都在最底下两层,最后一层的叶子节点都靠左排原创 2021-02-23 22:26:38 · 84 阅读 · 1 评论 -
哈希算法
1.定义将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法;而通过原始数据映射之后得到的二进制值串就是哈希值2. 哈希算法的要求从哈希值不能反向推导出原始数据对输入数据非常敏感散列冲突概率小,即不同的原始数据,哈希值相同的概率较小执行效率高效3. 应用安全加密最常用于加密的哈希算法是 MD5(MD5 Message-Digest Algorithm,MD5 消息摘要算法)和 SHA(Secure Hash Algorithm,安全散列算法)唯一标识原创 2021-02-23 22:03:00 · 227 阅读 · 0 评论 -
散列表1(Hash Table)
一、散列思想散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表1.散列函数把它定义成 hash(key),其中 key 表示元素的键值,hash(key) 的值表示经过散列函数计算得到的散列值。散列函数的设计要求:散列函数计算得到的散列值是一个非负整数;如果 key1 = key2,那 hash(key1) == hash(key2);如果 key1 ≠ key2,那 hash(key1) ≠ hash(原创 2021-02-20 14:43:49 · 95 阅读 · 0 评论 -
线性排序:桶排序
一、桶排序核心思想将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。时间复杂度如果要排序的数据有 n 个,我们把它们均匀地划分到 m 个桶内,每个桶里就有 k=n/m 个元素。每个桶内部使用快速排序,时间复杂度为 O(k * logk)。m 个桶排序的时间复杂度就是 O(m * k * logk),因为 k=n/m,所以整个桶排序的时间复杂度就是 O(n*log(n/m))。当桶的个数 m 接近数据个数原创 2021-02-20 14:18:23 · 61 阅读 · 0 评论 -
排序:快排查找一个无序数组中的第 K 大元素
一、归并排序核心思想先将数组从中间分成前后两部分,然后对这两部分分别排序,再将排序之后的数据合并用递归代码实现归并排序递推公式:merge_sort(p…r) = merge(merge_sort(p…q), merge_sort(q+1…r))终止条件:p >= r 不用再继续分解// 归并排序算法, A是数组,n表示数组大小merge_sort(A, n) { merge_sort_c(A, 0, n-1)}// 递归调用函数merge_sort_c(A原创 2021-02-20 14:03:37 · 403 阅读 · 1 评论 -
排序(冒泡、插入)
一、排序算法和时间复杂度分析排序算法执行效率1 、最好情况、最坏情况、平均情况时间复杂度2、时间复杂度的系数、常数 、低阶3、比较次数和交换(或移动)次数排序算法的稳定性例子:比如我们有一组数据 2,9,3,4,8,3,按照大小排序之后就是 2,3,3,4,8,9这组数据里有两个 3。经过某种排序算法排序之后,如果两个 3 的前后顺序没有改变,那我们就把这种排序算法叫作稳定的排序算法;如果前后顺序发生变化,那对应的排序算法就叫作不稳定的排序算法稳定性意义:可针对对象的多种原创 2021-02-20 13:16:18 · 64 阅读 · 0 评论 -
递归算法
一、递归的定义方法或函数调用自身的方式称为递归调用,调用称为递,返回称为归。递归是一种非常高效、简洁的编码技巧,应用广泛的算法,比如DFS深度优先搜索、前中后序二叉树遍历等都是使用递归二、递归的应用1.递归的优缺点优点:代码的表达力强,简洁缺点:空间复杂度高,存在重复计算,堆栈溢出2.递归可以解决的问题1)问题的解可以分解为若干子问题2)问题与子问题的求解思路一致3)存在递归终止条件三、递归的实现1)递归代码找到将大问题分解为小问题的规律,写出递推公式,然原创 2021-02-10 18:07:40 · 497 阅读 · 0 评论 -
队列
一、队列的定义队列是一种受限的线性表数据结构,队列跟栈非常相似,最基本的操作:入队enqueue();出队dequeue()先进先出,支持在队尾插入元素,在队头删除元素二、队列的实现队列可以用数组来实现,也可以用链表来实现。用数组实现的队列叫作顺序队列,用链表实现的队列叫作链式队列1.用数组来实现队列实现思路队列需要两个指针:一个head指针指向队头,一个tail指针指向队尾当我们调用两次出队操作之后,队列中 head 指针指向下标为 2 的位置,tail 指针仍然指向下标为原创 2021-02-10 17:47:44 · 127 阅读 · 0 评论 -
链表
一、链表的定义链表也是一种线性表链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构链表中的每一个内存块被称为节点Node。节点除了存储数据外,还需记录链上下一个节点的地址,即后继指针next二、链表的分类单链表1)单链表有两个节点,即首节点和尾节点。用首节点地址表示整条链表,尾节点的后继指针指向一个空地址null,表示这是链表上的最后一个节点。2)性能特点:插入和删除节点的时间复杂度为O(1),查找的时间复杂度为O(n)。循环链表1原创 2021-02-10 17:06:43 · 1708 阅读 · 1 评论 -
数组
一、数组的定义数组Array是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据1.线性表线性表是指数据排成像一条线一样的结构,每个线性表上的数据最多只有前后两个方向。常见的线性结构如:队列、栈、数组、链表等非线性结构如:二叉树、堆、图2.连续的内存空间和相同的数据类型随机访问:根据数组的下标随机访问数组中的元素计算机给每个内存单元分配一个地址,通过地址访问内存中的数据。例如:计算机给数组a[10],分配一个连续的内存空间1000-1039,其中base_addre原创 2021-02-10 16:43:35 · 87 阅读 · 0 评论 -
数据结构与算法
掘金专栏极客时间leetcode原创 2020-11-19 11:06:18 · 73 阅读 · 0 评论