数据结构与算法
文章平均质量分 58
数据结构和算法
牛奶咖啡13
你不知道你不知道[你永远不会去学习你不知道其存在的东西]
别人的故事在好,那也是别人的;人活成什么样子,得自己定!
展开
-
白话解析:一致性哈希算法 consistent hashing
在了解一致性哈希算法之前,最好先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那么,我们先来描述一下这个经典的分布式缓存的应用场景。场景描述假设,我们有三台缓存服务器,用于缓存图片,我们为这三台缓存服务器编号为0号、1号、2号,现在,有3万张图片需要缓存,我们希望这些图片被均匀的缓存到这3台服务器上,以便它们能够分摊缓存的压力。也就是说,我们希望每台服务器能够缓存1万张左右的图片,那么,我们应该怎样做呢?如果我们没有任何规转载 2021-03-23 10:29:23 · 146 阅读 · 0 评论 -
变形二分查找
一、查找第一、最后一个值等于(大于)给定值的元素/**** Title:"数据结构与算法" 项目* 主题:二分查找* Description:* 分析:* 1、查找的是一个有序的数据集合* 2、每次查找都是与区间的中间元素进行对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为0* Date:2021* Version:0.1版本* Author:Coffee* Modify Recoder:*/using System;us原创 2021-03-18 19:22:13 · 184 阅读 · 0 评论 -
简单二分查找
一、简单二分查找1.1、分析①查找的是一个有序的数据集合。②每次查找都是与区间的中间元素进行对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为0。1.2、算法执行效率①假设数据大小是 n,每次查找后数据都会缩小为原来的一半,也就是会除以 2。最坏情况下,直到查找区间被缩小为空,才停止。其中 n/2k=1 时,k 的值就是总共缩小的次数。我们可以求得 k=log2n,所以时间复杂度就是 O(logn)。②空间复杂度为O(1).1.3、特点①二分查找依赖原创 2021-03-17 21:49:58 · 217 阅读 · 0 评论 -
适用于大规模数据排序(归并排序、快速排序)
一、归并排序1.1、分析先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。1.2、使用递推思路实现①先写出递推公式:【mergeSort(startIndex...endIndex)=Merge(mergeSort(startIndex...middleIndex),mergeSort(middleIndex+1...endIndex))】②找到递推终止条件:【startIndex>=endIndex】.1.3、转化为原创 2021-03-16 23:29:59 · 1479 阅读 · 1 评论 -
如何分析一个排序算法(插入排序与冒泡排序)
一、分析思路1.1、排序算法的执行效率①最好、最坏、平均情况的世界复杂度;②时间复杂度的系数、常数、低阶;③比较次数和交换(或移动)次数。1.2、排序算法的内存消耗1.3、排序算法的稳定性二、示例2.1、冒泡排序①最好情况下,要排序的数据已经是有序的了,我们只需要进行一次冒泡操作,就可以结束了,所以最好情况时间复杂度是 O(n)。而最坏的情况是,要排序的数据刚好是倒序排列的,我们需要进行 n 次冒泡操作,所以最坏情况时间复杂度为 O(n2)。②冒泡的过程只涉及相邻数据原创 2021-03-15 22:15:41 · 206 阅读 · 0 评论 -
递归
一、递归1.1、递归需要满足的三个条件:①一个问题的解可以分解为几个子问题的解。②这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样。③存在递归终止条件。1.2、怎样实现递归①写出递推递归公式②找到递归中止条件1.3、示例假如这里有 n 个台阶,每次你可以跨 1 个台阶或者 2 个台阶,请问走这 n 个台阶有多少种走法?如果有 7 个台阶,你可以 2,2,2,1 这样子上去,也可以 1,2,1,1,2 这样子上去,总之走法有很多,那如何用编程求得总共有多少种走原创 2021-03-13 22:28:18 · 177 阅读 · 0 评论 -
循环队列
一、循环队列1.1、介绍①队列是一种“操作受限”的线性表,支持在队尾插入元素,在队头删除元素。先进者先出,这就是典型的“队列”结构。②用数组来实现队列的时候,在 tail==n 时,会有数据搬移操作,这样入队操作性能就会受到影响。那有没有办法能够避免数据搬移呢?我们来看看循环队列的解决思路。③循环队列,顾名思义,它长得像一个环。原本数组是有头有尾的,是一条直线。现在我们把首尾相连,扳成了一个环。【队列为空的判断条件仍然是 head == tail,tail=3,head=4,n=8,所以原创 2021-03-11 23:07:52 · 374 阅读 · 0 评论 -
顺序队列
一、基础队列(顺序队列)1.1、介绍队列是一种“操作受限”的线性表,支持在队尾插入元素,在队头删除元素。先进者先出,这就是典型的“栈”结构。1.2、特点①先进先出1.3、时间复杂度①队列需要两个指针:一个是 head 指针,指向队头;一个是 tail 指针,指向队尾。②入队、出队只涉及队头队尾个别数据的操作,所以时间复杂度都是 O(1)。③随着不停地进行入队、出队操作,head 和 tail 都会持续往后移动。当 tail 移动到最右边,即使数组中还有空闲空间,也无法继续往队原创 2021-03-11 22:28:40 · 450 阅读 · 0 评论 -
栈
一、栈1.1、介绍栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。后进先出,先进后出,这就是典型的“栈”结构。1.2、特点①后进先出,先进后出。1.3、时间复杂度①存储数据只需要一个大小为 n 的数组就够了。在入栈和出栈过程中,只需要一两个临时变量存储空间,所以空间复杂度是 O(1)。②注意,这里存储数据需要一个大小为 n 的数组,并不是说空间复杂度就是 O(n)。因为,这 n 个空间是必须的,无法省掉。所以我们说空间复杂度的时候,是指除了原本的数据存储空间外,算法运行原创 2021-03-10 21:45:44 · 140 阅读 · 0 评论 -
数组
一、数组1.1、介绍数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。1.2、特点①数组是线性表(Linear List)。顾名思义,线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。②数组是连续的内存空间和相同类型的数据。正是因为这两个限制,它才有了一个堪称“杀手锏”的特性:“随机访问”。但有利就有弊,这两个限制也让数组的很多操作变得非常低效,比如要想在数组中删除、插原创 2021-03-10 21:12:55 · 787 阅读 · 0 评论 -
算法的时间与空间复杂度
算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。那么我们应该如何去衡量不同算法之间的优劣呢?主要还是从算法所占用的「时间」和「空间」两个维度去考量。时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。 空间维度:是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。因此,评价一个算法的效率主要是看它的时间复杂度和空间复杂度情况。然而,转载 2020-11-04 20:25:21 · 148 阅读 · 0 评论 -
计数排序
一、计数排序 计数排序适用于一定范围内的整数排序。在取值范围不是很大的情况下,它的性能甚至快过那些时间复杂度为O(nlogn)的排序。计数排序有局限性:①当数列最大和最小值差距过大是,并不适用计数排序②当数列元素不是整数时,也不适合计数排序二、计数排序的原理假设数组中有20个随机数,取值范围在0-10,要求用最快的速度把这20个整数从小到大排序。现在有随机数组[9,3,5,4,9,1,2,7,8,1,3,6,5,3,4,0,10,9,7,9]三、计数排序核心...原创 2020-07-15 20:36:16 · 298 阅读 · 0 评论 -
树和二叉树
一、树的定义 树是n(n>=0)个节点的有限集。当n=0时,称为空树。在任意一个非空树中,有如下特点:《1》有且仅有一个特定的称为根的节点。《2》当n>1时,其余节点可分为m(m>0)个互不相交的有限集,每一个集合本身又是一个树,并成为根的子树。《3》树的最大层级数,被称为树的高度或深度。二、二叉树①二叉树是树的一种特殊形式【这种树的每个节点最多只有2个孩子节点】。②二叉树的两个孩子节点被分别称为【左孩子、右孩子】。③二叉树还有两种形式【满二叉树、完全二叉.原创 2020-07-06 17:45:21 · 298 阅读 · 0 评论 -
堆排序
一、堆排序①最大堆的堆顶是整个堆中的最大元素。②最小堆的堆顶是整个堆中的最小元素注意:如果删除一个最大堆的堆顶(则并不是完全删除,而是跟末尾的节点交换位置),经过自我调整,第二大的元素就会被交换上来,成为最大的堆顶。③二叉堆实际存储在数组中。二、堆排序的步骤①把无序的数组构建成为二叉堆【需要从小到大排序,则构建成最大堆;需要从大到小排序,则构建成最小堆】②循环删除堆顶元素,替换到二叉堆的末尾,调整堆产生新的堆顶。三、堆排序的核心/**** Title: "算法" 项原创 2020-07-05 16:44:39 · 224 阅读 · 0 评论 -
快速排序
一、快速排序 【分治法】快速排序在每一轮挑选一个基准元素,并让其他比他大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解为两个部分。【基元素选择】①最简单的方式是选择数列的第一个元素,但是在极端情况下快速排序需要进行n轮,时间复杂度为【】 ②为避免极端情况发生,可以随机选择一个元素作为基准元素,并且让基准元素和数列首元素交换位置。二、快速排序步骤①选定了基元素后,就把其他元素中小于基元素的都交换到基元素一边,大于基元素...原创 2020-07-04 15:21:01 · 408 阅读 · 0 评论 -
冒泡排序
一、冒泡排序原理1、把两个相邻的元素两两比较,当一个元素大于右侧相邻的元素时,则交换他们的位置,最后的元素一定是最大的数;2、当一个元素小于或等于右侧的相邻元素时,位置不变。3、所有的元素都要重复以上的1、2两个步骤。二、冒泡排序的时间复杂度 平均的时间复杂度为【】三、冒泡排序的稳定性 泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两..原创 2020-07-04 09:53:09 · 691 阅读 · 0 评论