随笔分类 -  算法

摘要:前言 之前写过一个多进程异步服务系统的小项目,里面对于多个进程之间使用的负载均衡算法。就是最简单的轮询办法,但是这种算法存在一个比较大的问题,如果其中一个服务器出现问题,那下一个服务器的负载会增大两倍。基于这个问题我这几天在看Go语言高级编程的书的时候,发现作者写了有关于负载均衡的章节,因此这里拿来 阅读全文
posted @ 2019-08-12 21:07 GoodRnne 阅读(312) 评论(0) 推荐(0)
摘要:前几天打算一直想找一个时间把字符串匹配算认真弄一下,今天不想看其他的东西,那就想着把字符串匹配算法好好整理梳理一下。 字符串匹配算法有几种相对比较出名的,分别是BF(暴力破解),RK()、BM()、KMP()。下文中 主串为被匹配的串, 模式串为匹配的串。 例如 s = “aabbcc”(主串),a 阅读全文
posted @ 2019-04-28 14:55 GoodRnne 阅读(1814) 评论(0) 推荐(0)
摘要:堆排序的时间复杂度和快排的平均时间复杂度一样为O(n log n)。其排序过程我们可以分为两个阶段一个就是建堆、另一个是排序。 建堆 对于建堆的办法有两种一种是像堆的插入操作一样,自下而上进行堆化。我们先假设堆中只有一个数据,然后此次插入到尾部进行堆化,当最后一个元素插入完毕并堆化之后就完成堆化。另 阅读全文
posted @ 2019-04-12 10:35 GoodRnne 阅读(241) 评论(0) 推荐(0)
摘要:概念 二分查找的对象必须是一个有序的数据集合,这有点类似于分治思想。每次都是通过和区间中间的元素进行比较,然后根据规则将查找区间缩小为原先的一半,直到找到需要查找的元素。由于每一次我们都是向数据集合的大小缩小为一半,因此二分查找的时间复杂度为O(nlog n)。相对于遍历查找时间效率高出很多(当然这 阅读全文
posted @ 2019-04-02 15:44 GoodRnne 阅读(400) 评论(0) 推荐(0)
摘要:对于不同的算法,其有不同的时间复杂度和空间复杂度,并且稳定性也不一样。其总结如下: 从上面可以看出,不同的排序算法具有不同的特性。再选择使用的时候也应该根据自己的实际需求来进行选择。 例子 我们拿C语言中的qsort()函数来举例。 再该函数中对一个数组进行排序的时候,它会先判断数组所占用的内存多大 阅读全文
posted @ 2019-04-01 11:09 GoodRnne 阅读(239) 评论(0) 推荐(0)
摘要:前面提到的几种排序最优的时间复杂度为O(nlog n),但在排序算法中还不是最优的,有几种算法的时间复杂度为O(n),因为时间复杂度是线性的,所以又称线性排序。他们有桶排序、计数排序、基数排序,之所以能够达到线性的时间复杂度,是因为他们都不涉及元素之间的比较操作,这就意味着他们的使用条件都比较苛刻。 阅读全文
posted @ 2019-03-31 11:10 GoodRnne 阅读(572) 评论(0) 推荐(0)
摘要:归并排序 对于一个待排序的数组,先将数组分成两部分,如果划分之后的一部分数组数目大于1,则我们继续对其划分,直到分成单个元素的数组。然后我们在申请相应的辅助空间,将两个数组进行进行合并,得到一个排序之后的数组,然后反复进行对比排序,直到生成一个最终和原数组一样大的排好序的数组。 归并排序使用的是分而 阅读全文
posted @ 2019-03-28 09:57 GoodRnne 阅读(160) 评论(0) 推荐(0)
摘要:快速排序 其利用的思想就是分治思想,最开始先从数组中随机选择一个元素p(为什么随机下面解释),然后以这个元素对数组中的元素进行分类,数组左侧都是小于p的元素, 右侧都是大于等于p的元素。这样就让数组分成了两部分。然后我们分别对左边和右边进行进行同样的操作(先随机选择元素,再进行分组)直到所有元素都排 阅读全文
posted @ 2019-03-27 11:04 GoodRnne 阅读(804) 评论(0) 推荐(0)
摘要:选择排序大体思路就是将数组分为已排序和未排序的数组,每次从数组中选择出最大(最小)的元素,然后将其插入到已排序数组的末尾。依次循环n次。 实现代码如下: 分析: 不稳定排序:在选择排序过程总每次都要找剩余未排序元素中的最小值,然后和前面的元素交换位置,这样会未排序之前的相同元素的顺序被打乱。 并且为 阅读全文
posted @ 2019-03-26 11:26 GoodRnne 阅读(141) 评论(0) 推荐(0)
摘要:插入排序的大体思路就是一开始会将未排序的数据分为两部分,一部分是已排序的数组,另一部分是未排序的数组。然后将未排序数组中的第一个元素挑出来,和前面已排序的数组进行比较,插入合适的位置。依此进行,直到未排序数组为空。 例如:待排序的数组为[4, 5,6,1,3,2], 一开始 一排序的数组为[ 4 ] 阅读全文
posted @ 2019-03-26 11:06 GoodRnne 阅读(145) 评论(0) 推荐(0)
摘要:冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。简单来说的话就是从第一个元素开始,然后和后面的一个进行比较,如果第一个元素比后面的一个 阅读全文
posted @ 2019-03-26 10:41 GoodRnne 阅读(264) 评论(0) 推荐(0)