算法
文章平均质量分 77
不住在隔壁的老王
这个作者很懒,什么都没留下…
展开
-
数学相关 - HyperLogLog算法原理
一文理解HyperLogLog算法原理原创 2023-02-15 16:56:14 · 406 阅读 · 0 评论 -
计算机基础 - 位运算
与运算&, 与, 两位都为1, 结果才为1, (都真才真)与的用途清零如果想将一个单元清零, 只要与一个各位都为零的数相与, 结果就为零取一个数的指定位比如取x的低四位, 只需要找另一个数y, 令y的低4位为1, 其余位为0, 然后x和y按位与运算, 即可得到x的指定位判断奇偶二进制末位是0就是偶数, 1就是奇数, 可以用a&1==0判断a是不是偶数或运算|, 或, 两位都为0, 结果才为0, (都假才假)或的用途对一个数据的某些位设置为1比如将x的低四位设置为1,原创 2022-03-09 15:50:19 · 296 阅读 · 0 评论 -
数据结构学习笔记 - 常见算法思想
常见算法思想简介几种常见的算法思想, 用来指导我们设计具体的算法和编码, 有贪心算法, 分治算法, 回溯算法, 动态规划贪心算法(greedy algorithm)经典应用, 霍夫曼编码, Prim和Kruskal最小生成树算法, Dijkstra单源最短路径算法经典问题, 背包问题, 固定容量下, 让背包里装的物品总价值最大, 贪心算法用法则是计算物品单价, 单价从高到低依次放入包中使用贪心算法解决问题的步骤第一步, 看到这类问题, 首先联想到贪心算法尝试看下这个问题是否能用贪心算法解原创 2021-07-30 19:28:27 · 411 阅读 · 0 评论 -
数据结构学习笔记 - 动态规划
动态规划(Dynamic Programming)动态规划比较适合求解最优问题, 比如最大值最小值, 可以非常显著的降低时间复杂度有点难, 求解过程不符合常规思维方式, 先看两个例子0-1背包问题一组不同重量, 不可分割的物品, 选择一些装入背包, 在背包限重前提下, 背包里能装下的物品重量最大值回溯算法时间复杂度高, 指数级别, 回溯递归求解过程中, 有些子问题的求解是重复的, 此时可引入递归中的备忘录来解决, 避免冗余计算, 此时执行效率已经和动态规划差不多了而动态规划是这么做, 求解过程分原创 2021-07-30 19:26:34 · 106 阅读 · 0 评论 -
数据结构学习笔记 - 字符串匹配
字符串匹配简介字符串匹配都不陌生, 例如Java中的indexOf(), Python中的find(), 他们底层就是依赖以下的字符串匹配算法我们从字符串A中查找字符串B, 则A就是主串, B就是模式串字符串匹配算法很多, BF和RK比较简单, BM和KMP比较难但更高效, 这些都是单模式串匹配, Trie树和AC自动机可以多模式串匹配BF算法(Brute Force)中文叫暴力匹配算法, 也叫朴素匹配算法, 简单好懂但性能不高例如主串A长度n, 模式串B长度m核心就是在主串中, 检查起始位原创 2021-03-10 15:51:16 · 314 阅读 · 0 评论 -
数据结构学习笔记 - 图
图简介图是一种非线性表数据结构, 比树更加复杂涉及图的算法有很多, 比如图的搜索, 最短路径, 最小生成树, 二分图等图的基本概念图中的元素叫做顶点, 一个顶点可以与任意其他顶点建立连接关系, 这种建立的关系, 叫做边跟顶点相连接的边的条数, 叫做顶点的度图的边可以有方向, 边有方向的叫做有向图, 边没有方向的叫做无向图有向图中, 把度分为入度和出度, 入度表示有多少条边指向这个顶点, 出度表示有多少条边是以这个顶点为起点指向别的顶点另一种图, 带权图, 每条边都有一个权重图的存储邻原创 2021-03-04 16:55:09 · 151 阅读 · 1 评论 -
数据结构学习笔记 - 堆和堆排序
堆和堆排序简介堆, 是一种特殊的树经典的应用场景, 堆排序, 原地的时间复杂度为O(nlogn)的排序算法堆的两点定义:堆是一个完全二叉树堆中每一个节点的值都必须大于等于/小于等于其子树中每个节点的值每个节点的值都大于等于子树中每个节点值的堆叫做大顶堆, 反之叫做小顶堆实现一个堆之前说过完全二叉树适合用数组存储, 所以堆也用数组存储堆的核心操作有插入元素和删除堆顶元素, 以大顶堆为例插入元素(todo)把新插入的元素放到堆的最后, 并进行调整使其重新满足堆的特性的过程, 叫堆化原创 2021-03-02 19:19:50 · 185 阅读 · 0 评论 -
数据结构学习笔记 - 红黑树
红黑树一般讲到平衡二叉查找树, 都会拿红黑树作为例子, 工程中, 很多用到平衡二叉查找树的地方都会用到红黑树但凡用到动态插入, 删除, 查找数据的场景, 都可以用到它, 不过自己实现起来难度有点高什么是平衡二叉查找树平衡二叉树定义: 二叉树中任意一个节点的左右子树的高度相差不能大于1.完全二叉树, 满二叉树, 都是平衡二叉树平衡二叉查找树不仅满足上面定义, 还满足二叉查找树的特点最先被发明的平衡二叉查找树是AVL树但很多平衡二叉查找树并没有严格符合上面的定义, 比如红黑树设计初衷是解决,原创 2021-02-24 15:50:33 · 92 阅读 · 0 评论 -
数据结构学习笔记 - 二叉树
二叉树简介树, 非线性表结构树有三个概念:高度从下向上数, 起点是0深度从上向下数, 起点是0层数从上向下数, 起点是1二叉树每个节点最多两个叉有两种特殊二叉树:满二叉树, 除了叶子节点, 每个节点都有左右两个子节点完全二叉树, 叶子节点都在最底下两层, 最后一层叶子节点都靠左排列, 且除了最后一层, 其它层节点个数都达到最大满二叉树是完全二叉树的一种特殊情况存储二叉树基于指针的二叉链式存储法每个节点三个字段, 一个存数据, 另外两个存左右子节点的指针, 这种方式比较常用,原创 2021-01-28 15:28:44 · 125 阅读 · 0 评论 -
数据结构学习笔记 - 哈希算法
哈希算法简介将任意长度的二进制值串映射为固定长度的二进制值串的映射规则就是哈希算法得到的二进制值串就是哈希值优秀的哈希算法包括从哈希值不能反推出原始数据对输入数据非常敏感, 哪怕一点小修改, 结果也大不相同散列冲突的概率要很小, 对不同原始数据, 哈希值相同的概率非常小执行效率要高效, 针对较长的文本, 也能快速计算出哈希值鸽巢原理为什么哈希算法无法做到零冲突因为哈希值的长度是固定的, 那么就表示数据是有限的, 而要哈希的数据是无限的, 就必然会有数据存在哈希值相同的情况哈希算法原创 2020-12-16 15:30:19 · 398 阅读 · 0 评论 -
数据结构学习笔记 - 散列表(Hash表)
散列表(Hash表)简介散列表依赖的是数组支持按下标随机访问数据的特性所以散列表是数组的一种扩展, 由数组演化而来, 如果没有数组就没有散列表时间复杂度O(1), 通过散列函数把元素的key映射为下标, 将数据存储在数组中对应下标的位置当按key查询元素时, 用同样的散列函数, 将key转化为下标, 从对应的数组下标位置取数据设计散列表要可以应对各种异常情况的工业级散列函数的设计不能太复杂散列函数设计的好坏直接决定散列表的性能散列函数生成的值要尽可能随机且均匀分布散列函数计算结果是非原创 2020-12-07 18:55:33 · 210 阅读 · 0 评论 -
数据结构学习笔记 - 跳表
跳表(Skip List)简介基于链表稍加改造的一种各方面性能都比较优秀的动态数据结构, 可支持快速插入, 删除, 查找操作, 甚至可以代替红黑树基于原链表每两个结点向上一级抽索引, 构建出一级索引层, 可构建多级索引, 这种链表加多级索引的结构, 就是跳表redis中的有序集合(sorted set)就是采用跳表实现跳表中查询任意数据的时间复杂度都是O(logn), 但空间复杂度O(n), 每三到五个元素抽一个索引可以减少索引存储空间占用但实际开发中不必太在意索引占用的额外空间, 因为当原始链原创 2020-12-02 17:02:55 · 112 阅读 · 0 评论 -
数据结构学习笔记 - 二分查找
二分查找简介二分查找, 也叫折半查找, 是一种简单的快速查找算法二分查找针对的是一个有序的数据集合, 查找思想类似分治, 每次都通过跟区间的中间元素对比, 将待查找的区间缩小为之前的一半, 直到找到要查找的元素, 或者区间被缩小为0时间复杂度O(logn), 对数时间复杂度代码实现二分查找的递归与非递归实现最简单的情况是有序数组中不存在重复元素循环实现 (todo)递归实现 (todo)容易出错的三个地方循环退出条件, low<=highmin的取值, low和high比较大原创 2020-12-02 15:25:59 · 81 阅读 · 0 评论 -
数据结构学习笔记 - 排序
排序简介排序算法有很多, 最经典最常用的有冒泡排序, 插入排序, 选择排序, 时间复杂度 O(n平方)快速排序, 归并排序, 时间复杂度O(nlogn)桶排序, 计数排序, 基数排序, 时间复杂度O(n)分析排序算法执行效率最好情况, 最坏情况, 平时情况时间复杂度时间复杂度的系数, 常数, 低阶元素比较次数和移动次数内存消耗可以通过空间复杂度来衡量稳定性稳定排序算法可以保持数值相同的两个对象, 在排序之后的前后顺序不变真实开发中排序场景往往比较复杂, 有些问题借助稳原创 2020-11-30 17:27:55 · 161 阅读 · 0 评论 -
数据结构学习笔记 - 递归
递归基本介绍递归是一种应用非常广泛的, 高效简洁的编程技巧, 很多数据结构和算法的编码实现都要用到递归递归需要满足的三个条件一个问题的解可以分解为几个子问题的解原问题和分解后的子问题求解思路完全一致存在递归终止条件写递归代码的关键写递归代码的关键就是找如何将大问题分解成小问题的规律, 并且基于此写出递推公式, 然后推敲终止条件, 最后将递推公式和终止条件翻译成代码只要遇到递归, 就把他抽象成一个递推公式, 不用想一层层的调用关系, 不要试图用人脑去分析递归的每一个步骤递归常见问题原创 2020-11-26 19:13:23 · 126 阅读 · 0 评论 -
数据结构学习笔记 - 队列
队列基本特性先进者先出, 这就是典型的队列和栈很相似, 队列的基本操作也是两个, 入队和出队和栈一样也是一种操作受限的线性表数据结构实现一个队列用数组实现的队列叫顺序队列 (todo)用链表实现的队列叫链式队列 (todo)队列的应用阻塞队列队列为空时取数据被阻塞, 队列满时, 插入数据被阻塞, 即生产者消费者模型并发队列多线程的情况下, 线程安全的队列叫并发队列, 基于数组的循环队列, 利用CAS原子操作, 可实现非常高效的并发队列, 因此循环队列比链式队列应用更加广泛小结原创 2020-11-25 16:58:36 · 78 阅读 · 1 评论 -
数据结构学习笔记 - 栈
栈基本特性后进者先出, 先进者后出, 这就是典型的栈结构栈是一种操作受限的线性表, 只允许在一端插入和删除数据栈是一种特定的数据结构,是对特定场景的抽象当某个数据集合只涉及在一端插入和删除数据, 并且满足后进先出, 先进后出的特性, 我们就应该首选栈这种数据结构实现一个栈栈主要包含两个操作, 入栈和出栈用数组实现的栈叫顺序栈 (todo)用链表实现的栈叫链式栈 (todo)两种实现的空间复杂度和时间复杂度都为O(1)栈的应用函数调用栈操作系统给每个线程分配了一块独立的内存空间,这原创 2020-11-25 15:06:42 · 311 阅读 · 0 评论 -
数据结构学习笔记 - 链表
链表比数组稍微复杂一点的数据结构简介不需要连续的内存空间, 通过指针将一组零散的内存块串联起来使用.链表结构五花八门, 三种最常见的链表结构, 单链表, 双向链表, 循环链表.单链表被串联的内存块称为结点, 每个结点存有数据和记录下一个结点的地址, 叫做后继指针next第一个结点叫头结点, 最后一个结点叫尾结点, 尾结点指向一个空地址null.链表也支持数据的查找, 插入和删除操作链表的插入和删除操作只需要考虑相邻接点的指针改变, 所以时间复杂度为O(1).但想要随机访问第k个元素, 就原创 2020-09-03 15:30:10 · 119 阅读 · 0 评论 -
数据结构学习笔记 - 数组
数组基础数据结构定义数组是一种线性表数据结构, 使用一组连续内存空间, 存贮一组具有相同类型的数据.提炼两组关键词:1. 线性表线性表只有前后两个方向, 同样线性表还有链表, 队列, 栈.非线性表有二叉树, 堆, 图等, 数据并不是前后关系.2. 连续内存空间和相同类型的数据因为这两个限制, 数组拥有了随机访问的特性, 但也有利有弊, 插入和删除操作变得低效.数组插入操作平均时间复杂度O(n), 当数据无序时, 可将插入位置元素直接搬到末尾来优化执行速度.数组删除操作平均时间复杂度O(原创 2020-09-01 16:05:50 · 184 阅读 · 0 评论 -
算法题-海盗分赃
6个海盗要分赃300金币。规则是由资格最老的海盗提出各人分到的数量,然后全体投票。如方案得到至少半数同意票,则按该方案执行,否则提出方案的海盗被杀死,再由剩下人中资格最老的继续提出方案。海盗都很聪明,在能生存的前提下会追求获利最大化。问最后分赃结果是怎样的?这道题详细的解题步骤一搜就有, 我只说一下我自己的理解.两个人?首先还是需要简化这道题, 假如只有两个人, 应该怎么分因为只要投...原创 2018-11-27 10:23:14 · 1438 阅读 · 1 评论