随笔分类 - 数据结构与算法
数据结构与算法
摘要:1 求解思路 全排列表示把集合中元素的所有按照一定的顺序排列起来,使用P(n, n) = n!表示n个元素全排列的个数。P(n, n)中的第一个n表示元素的个数,第二个n表示取多少个元素进行排列。 给定一个n个元素数组,其全排列的过程可以描述如下: 任意取一个元素放在第一个位置,则有n种选择; 再剩
阅读全文
摘要:前言 二叉查找树是最常用的一种二叉树,它支持快速插入、删除、查找操作,各个操作的时间复杂度跟树的高度成正比,理想情况下,时间复杂度是O(logn)。 不过,二叉查找树在频繁的动态更新过程中,可能会出现树的高度远大于log2n 的情况,从而导致各个操作的效率下降。极端情况下,二叉树会退化为链表,时间复
阅读全文
摘要:高度(Height)、深度(Depth)、层(Level)。它们的定义是这样的:
阅读全文
摘要:创建1个节点 连接3个节点 前序遍历、中序遍历、后续遍历二叉树(包括递归法与非递归法(辅助栈)) 清除二叉树 在二叉搜索树中插入1个节点(和链表一样,注意使用二级指针,因为可能插入的是根节点) 在二叉搜索树中查找1个节点 在二叉搜索树中删除一个节点(和链表一样,注意使用二级指针,因为可能删除的是根节
阅读全文
摘要:带着问题来学习: 如何防止数据库中的用户信息被脱库? 你会如何存储用户密码这么重要的数据吗?仅仅 MD5 加密一下存储就够了吗? 在实际开发中,我们应该如何用哈希算法解决问题? 一、什么是哈希算法? 不管是“散列”还是“哈希”,这都是中文翻译的差别,英文其实就是“Hash”。 1.1 定义 将任意长
阅读全文
摘要:一、为什么散列表和链表经常放在一起使用? 1.散列表的优点:支持高效的数据插入、删除和查找操作 2.散列表的缺点:不支持快速顺序遍历散列表中的数据 3.如何按照顺序快速遍历散列表的数据?只能将数据转移到数组,然后排序,最后再遍历数据。 4.我们知道散列表是动态的数据结构,需要频繁的插入和删除数据,那
阅读全文
摘要:Java中的HashMap、LinkedHashMap的解决散列冲突策略都是链表法(数据规模大),但多线程中的ThreadLocalMap则是用的开放寻址法(因为规模数据小、装载因子不高)。 何为一个工业级的散列表?工业级的散列表应该具有哪些特性? 1.支持快速的查询、插入、删除操作; 2.内存占用
阅读全文
摘要:一、线性排序算法介绍 线性排序算法包括桶排序、计数排序、基数排序。 线性排序算法的时间复杂度为O(n)。 此3种排序算法都不涉及元素之间的比较操作,是非基于比较的排序算法。 对排序数据的要求很苛刻,重点掌握此3种排序算法的适用场景。 二、桶排序(Bucket sort) 2.1 算法原理 1)将要排
阅读全文
摘要:一、什么是跳表? 为一个值有序的链表建立多级索引,比如每2个节点提取一个节点到上一级,我们把抽出来的那一级叫做索引或索引层。如下图所示,其中down表示down指针,指向下一级节点。以此类推,对于节点数为n的链表,大约可以建立log2n-1级索引。像这种为链表建立多级索引的数据结构就称为跳表。 二、
阅读全文
摘要:查找第一个值等于给定值的元素 查找最后一个值等于给定值的元素 查找第一个大于等于给定值的元素 查找最后一个小于等于给定值的元素 查找循环有序数组中等于给定值的元素 #include <iostream> #include <vector> #include <stack> #include <cst
阅读全文
摘要:时间复杂度O(logn),很强 适用于数组的数据结构,但不适用于链表,因为链表不支持随机访问 只能查找有序数组,如果是无序的,需要进行一次排序(最低时间复杂度O(nlogn)) 数据量小不适用,直接用遍历查找即可 数据量太大也不适用,因为数据结构是数组,需要的是连续的内存空间 #include <i
阅读全文
摘要:优先使用归并排序(因为归并排序空间复杂度是O(n),并且是稳定排序算法,时间复杂度O(nlogn)) 当需排序的数据量比较大的时候,改为使用优化快排(比如三数取中获取分区点) 当快排时,排序的元素个数小于7时,快排退化为插入排序 传统的快排算法,由于分区点选的不好,可能就会导致算法效率过低。常用分区
阅读全文
摘要:从尾到头打印链表(要求不改变链表结构) 反转链表(要求仅遍历一次链表) 合并两个有序链表(非递归方法) 删除倒数第k个节点 链表中环的入口节点(包括判断环的存在,确定环中节点个数等问题) 求链表中间节点 ListNode.h #pragma once #include <iostream> usin
阅读全文
摘要:正宗快速排序算法C++版本,看图一目了然。 归并排序和快速排序都用到了分治思想。这两种排序算法适合大规模的数据排序。 平均时间复杂度O(nlogn)。 空间复杂度O(logn)~O(n)。 #include <iostream> #include <vector> #include <stack>
阅读全文
摘要:正宗归并排序算法C++版本,看图一目了然。 归并排序和快速排序都用到了分治思想。这两种排序算法适合大规模的数据排序。 归并排序的执行效率与要排序的数组的有序程度无关,所以其时间复杂度是非常稳定的,不管最好、最坏、平均时间复杂度都是O(nlogn)。 空间复杂度是O(n)。 void merge(in
阅读全文
摘要:正宗选择排序算法C++版本,看图一目了然。并总结三种简单排序算法时间复杂度分析 最低时间复杂度O(n2),最高时间复杂度O(n2),平均时间复杂度O(n^2) #include <iostream> #include <vector> #include <stack> #include <cstri
阅读全文
摘要:正宗插入排序算法C++版本,看图一目了然。 最低时间复杂度O(n),最高时间复杂度O(n2),平均时间复杂度O(n2) #include <iostream> #include <vector> #include <stack> #include <cstring> #include <string
阅读全文
摘要:正宗冒泡排序算法C++版本,看图一目了然。 最低时间复杂度O(n),最高时间复杂度O(n2),平均时间复杂度O(n2) #include <iostream> #include <vector> #include <stack> #include <cstring> #include <string
阅读全文
摘要:算法分析神器—时间复杂度 时间复杂度是学习算法的基石,今天我们来聊聊为什么要引入时间复杂度,什么是时间复杂度以及如何去算一个算法的时间复杂度 刻画算法的运行时间 某日,克叫来了慧子打算给他补习补习一下基础知识,只见克写了一段非常简单的代码 克 你说一下这段代码会运行多长时间 这个...,得在计算机上
阅读全文