
算法
Seven17000
与其临渊羡鱼,不如退而结网。
展开
-
排序算法:基数排序(桶排序)
简介 基数排序(升序)是一种非比较式的排序方式,和之前博文中提到的快排,冒泡排序,插入排序这些排序算法不一样,它没有使用任何交换的方式,那么又是通过什么方式进行的排序呢?它的基本思想是通过分配的方法把元素从小到大分配,以到达排序的作用。算法描述 1.创建10个桶,分别用来放对应的数字; 2.按照最低位(个位)的数字分配到相应的桶里面; 3.把桶里的数字依次放回数组; 4.按照次低位的数字分原创 2017-03-28 19:54:32 · 1493 阅读 · 0 评论 -
分布式服务器中一致性哈希算法的简介
简介首先我们需要知道什么是哈希,哈希一般都是将一个大数字取模然后分散到不同的容器里面,在一个分布式的服务器系统之中,通常会使用哈希的算法来处理服务器的负载均衡问题,每一个服务器就是一个容器,我们把数据按照哈希算法分布在不同的服务器,这样就可以减小服务器的负载,增大服务器的处理能力。一致性哈希和普通哈希那么,一致性哈希和普通哈希有什么区别呢?其实一般的哈希都是不一致的。例如这里有6个数字,123456原创 2017-07-27 01:10:53 · 918 阅读 · 0 评论 -
一致性哈希算法的两种优化方案
简介上一篇博客我简单的介绍了一致性哈希算法的基本思想。但是一致性哈希算法的提出当然也同样伴随着新的问题出现,那就是当某一个服务器结点挂掉之后,它的任务就会分配到它的下一个服务器结点,那么这就有悖于分布式系统中需要满足平衡性的要求。问题雪崩效应在服务器上会有一些数据会经常被访问,这些数据的访问次数远远高于其他数据,那么这些数据就被称为热点数据,理所当然在分布式服务器中承载这些热点数据的服务器的负载就要原创 2017-07-27 16:12:45 · 4688 阅读 · 1 评论 -
各类排序算法比较和应用场景
简介插入排序插入排序是一种较为简单的排序算法,它的基本思想是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 形象的可以理解为打扑克抓拍的过程,通常我们右手抓牌,没抓一张牌,就放到左手,抓下一张牌后,会把这张牌依次与左手上的牌比较,并把它插入到一个合适的位置(按牌面大小)。希尔排序希尔排序是对直接插入排序的一种优化,实质就是把直接插入排序改为了分组插入排序。其基原创 2017-03-28 21:47:01 · 23750 阅读 · 2 评论 -
实现时间复杂度为O(nlogn)的链表排序算法
简介链表排序是一道常见的关于链表的算法题,往往我们会使用冒泡排序或者选择排序这两种算法来解决这个问题。但是它们的时间复杂度是O(n²),效率不高。所以今天我们要实现时间复杂度O(nlogn)的算法就不能再选择这两种排序算法。而满足这个时间复杂度的排序算法只有快速排序,堆排序和归并排序。但是因为快排和堆排是不稳定的,所以我选择了归并排序算法来实现链表排序问题。关于归并排序我以前写过一篇博客,里面介绍了原创 2017-04-20 15:15:30 · 4388 阅读 · 0 评论 -
排序算法:冒泡排序
简介冒泡排序(这里指升序)是一种非常简单直观的排序方式,它是一种交换式的排序方法,基本思想就是相近的两个数字作比较,小的放到前面,大的放大后面,按照这个规则从头向后比较。直到数组有序。 之所以把它叫为冒泡排序就是因为排序过程就像气泡在水中上浮一样,大的数字一步一步的就被换到了数组的末尾。但是冒泡排序效率比较,不适合大规模的数据排序工作,一般情况很少用到这种排序方法。算法描述设数组长度为N。 1.原创 2017-03-21 22:07:15 · 846 阅读 · 0 评论 -
排序算法:插入排序
简介插入排序是一种较为简单的排序算法,它的基本思想是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 形象的可以理解为打扑克抓拍的过程,通常我们右手抓牌,没抓一张牌,就放到左手,抓下一张牌后,会把这张牌依次与左手上的牌比较,并把它插入到一个合适的位置(按牌面大小)。上述过程即插入排序过程。算法描述1.从第一个元素开始,该元素可以认为已经有序; 2.取下一个元素,原创 2017-03-18 20:13:59 · 1041 阅读 · 0 评论 -
排序算法:希尔排序
简介插入排序在对接近有序的序列进行排序时,效率高,几乎可以接近线性排序。时间复杂度可以达到O(N)。但是一般情况下,直接插入排序的效率是比较低的,因为他它只能每次移动一个数据。 希尔排序则是对直接插入排序的一种优化,实质就是把直接插入排序改为了分组插入排序。其基本思想就是将整个待排序元素序列按gap(步长)分割为N个组,对每个组进行直接插入排序,然后在减小gap(步长)再进行直接插入排序,直到ga原创 2017-03-19 13:20:35 · 747 阅读 · 0 评论 -
排序算法:选择排序
简介选择排序的排序思想就和它的名字一样,每次通过从无序的数组中选择出一个最小的(要求升序排列)数把他放到数组的最前面。再依次找次小的数字放到数组无序区的最前。直到数组为有序。算法描述1.从数组的第一个数字开始,往后遍历,相互比较,找到最小的数; 2.把最小的数归到数组的第一个位置,归好位的数字为有序区,后面为有序区; 3.以无序区为基准重复步骤1~2,直到数组有序。时间复杂度:O(N^2)代码实原创 2017-03-19 20:57:29 · 1049 阅读 · 0 评论 -
排序算法:堆排序
简介堆排序(使用大堆,升序)从基本实现原理来说也是一种选择排序,它同样是确定了位置选择符合位置的元素,但是堆排序是更加优化的选择排序的版本,它利用了堆的特性。父结点的值大于子结点,且满足完全二叉树,大大提高了选择排序的效率。算法描述1.对无序数组建立堆(大堆)模型, 堆模型满足父结点值大于子结点值,且抽象出来的是完全二叉树; 2.把堆顶最大值与堆尾最后一个值交换,最大值就归到正确位置(有序区),原创 2017-03-20 22:35:19 · 785 阅读 · 0 评论 -
排序算法:快速排序
简介快速排序是一种在实际应用中经常用到的排序算法,它的应用场景是大规模的数据排序,并且实际性能要好于归并排序。它的基本原理是从数组中选取一个元素,把所有大于这个元素的数都放到它的后面,所有小于这个元素的数都放到它的前面,然后这个元素就把原数组切分成了两个部分,再分别对这个两个部分进行同样的操作,直到数组不能再切分的时候,此时数组为有序。 这种切分的算法思想被称为分治法,在实际应用中这种思想也被广泛原创 2017-03-22 20:43:59 · 828 阅读 · 0 评论 -
排序算法:归并排序
简介“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表,归并排序和快排一样也采用的是分治的思想,它的基本原理是通过对若干个有序结点序列的合并为一个有序序列来实现排序的。 它的效率是比较高的的排序方法,他通常应用于数据量比较大的场合。 下面这篇博客讲解了如何使用使用归并求一个整数序列中逆序对数(http://blog.youkuaiyun.com/mitedu/article/details/388原创 2017-03-23 22:32:10 · 971 阅读 · 1 评论 -
如何获取一定范围内不重复的随机数
简介生成一个随机数是很多时候需要实现的,往往会采用时间种子的方式,如下所示。#include <iostream>using namespace std;int main(){ int i = rand(); printf("%d", i); return 0;}这种直接使用rand函数去获取随机数的方式由于使用了默认的随机种子,所以获得的...原创 2018-08-06 10:54:41 · 2945 阅读 · 0 评论