
算法
文章平均质量分 54
记录算法相关知识
盼兮猫
长亭外 古道边 芳草碧连天
展开
-
一致性 Hash 算法
假设现在有 5 台 redis 实例,每台实例负责保存一部分数据。客户端通过如下算法定位具体实例: hash(key) % 5 随着业务发展,数据越来越多,5 台实例已经无法满足业务。现在要新增两台,新增两台后客户端算法如下: hash(key) % 7 这就导致老算法计算出的值和新算法不一致:之前 hash(a) % 5 == 1,key 为 a 的键值对保存在 1 号实例,而 hash(a) % 7 的值可能等于其它值。这就导致因为扩容(缩容)后所有旧 key 都失效。为了解决该问题,一致性 H原创 2021-08-04 11:06:08 · 118 阅读 · 0 评论 -
二分查找思想及实现
使用二分查找必须满足集合有序,只有集合有序时才能使用二分 思想:找出中点元素,此时左侧全是小于它的元素,右侧全是大于它的元素,根据需要选择左半边或右半边,直到找到对应元素 实现: // 递归实现 public boolean find(int[] num, int start, int end, int val) { if (start > end) { return false; } int mid = start + (end - start) / 2;原创 2021-07-29 14:17:46 · 126 阅读 · 0 评论 -
快速排序及优化
冒泡排序和快速排序都属于交换排序,其中快排更像是冒泡的进化版本,我们先看冒泡排序: 思想:每轮循环将本轮最大元素移动到数组末尾,以此类推,直到长度为一。假设数组长度为 n,第一轮循环将最大元素移动到下标为 n-1 的位置,第二轮需要判断前 n -1 个元素,并将最大元素移动到 n-2 的位置,以此类推。计算最大值通过比较交换完成。 private void sort(int[] a) { // 长度为 n 的数组需要 n-1 轮循环 for (int i = 1; i <= a.length原创 2021-06-08 16:51:26 · 97 阅读 · 0 评论 -
堆排序实现
之前笔者在遇到一些需要用到堆的算法题,如 n 个数求最大的 k 个数时经常使用优先队列,Java 通过 PriorityQueue 实现优先队列,本篇我打算通过数组实现堆,并简单说明堆和优先队列的区别 堆本质是完全二叉树,通过二叉树也更容易理解,一般通过数组实现,通过数组实现时,具体规则如下图: 完全二叉树:数按照从上到下,从左到右的顺序赋值,之间不存在空节点 按不同功能,堆可以划分为以下两类: 最大堆:节点值大于其左右子树的值,左右子树也是最大堆 最小堆:节点值小于其左右子树的值,左右子树也是最小原创 2021-07-30 20:06:27 · 120 阅读 · 0 评论