数据结构
文章平均质量分 55
喜欢恋着风
这个作者很懒,什么都没留下…
展开
-
快速浮点开方运算
二分法浮点开方也就是给定一个浮点数x,求根号x。这个简单的问题有很多解,我们从最简单最容易想到的二分开始讲起。利用二分进行开平方的思想很简单,就是假定中值为最终解。假定下限为0,上限为x,然后求中值;然后比较中值的平方和x的大小,并根据大小修改下限或者上限;重新计算中值,开始新的循环,直到前后两次中值的距离小于给定的精度为止。需要注意的一点是,如果x小于1,我们需要将上限置为1,原因你懂的。 代码原创 2017-06-21 20:42:21 · 1012 阅读 · 1 评论 -
常见缓存算法和LRU的C++实现
对于web开发而言,缓存必不可少,也是提高性能最常用的方式。无论是浏览器缓存(如果是chrome浏览器,可以通过chrome:://cache查看),还是服务端的缓存(通过memcached或者redis等内存数据库)。缓存不仅可以加速用户的访问,同时也可以降低服务器的负载和压力。那么,了解常见的缓存淘汰算法的策略和原理就显得特别重要。常见的缓存算法LRU (Least recently used原创 2017-09-04 10:56:36 · 787 阅读 · 0 评论 -
排序算法总结
插入排序特点:stable sort、In-place sort 最优复杂度:当输入数组就是排好序的时候,复杂度为O(n),而快速排序在这种情况下会产生O(n^2)的复杂度。 最差复杂度:当输入数组为倒序时,复杂度为O(n^2) 插入排序比较适合用于“少量元素的数组”。其实插入排序的复杂度和逆序对的个数一样,当数组倒序时,逆序对的个数为n(n-1)/2,因此插入排序复杂度为O(n^2)。voi原创 2017-07-27 23:42:34 · 206 阅读 · 0 评论 -
STL sort 源码剖析
简介STL的 sort() 算法,数据量大的时候采用Quick Sort,分段递归排序,一旦分段后的数据量小于某个门槛,为避免Quick Sort 的递归调用带来过大的额外负担,就改用Insertion Sort。如果递归层次过深,还会改用Heap Sort。 本文介绍这三个Sort 算法,再整合分析STL Sort算法(以上三种算法的综合)—-Introspective Sorting(内省式排原创 2017-08-03 22:39:11 · 453 阅读 · 0 评论 -
布隆过滤器及其实现
简介(Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的。loom Filter是一种空间效率很高的随机数据结构,它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于可以快速且空间效率高的判断一个元素是否属于一个集合;用来实现数据字典,或者集合求交集:优点: 空间效率和查询时间都远远超过一般算法;缺点: 有一定的误识别率(假原创 2017-08-10 18:22:08 · 764 阅读 · 0 评论 -
给定一个函数rand()能产生0到n-1之间的等概率随机数,问如何产生0到m-1之间等概率的随机数?
题目:给定一个函数rand()能产生1到n之间的等概率随机数,问如何产生1到m之间等概率的随机数?先把问题特殊化,例如原题变为给定一个函数rand5(),该函数可以随机生成1-5的整数,且生成概率一样。现要求使用该函数构造函数rand7(),使函数rand7()可以随机等概率的生成1-7的整数。很多人的第一反应是利用rand5() + rand()%3来实现rand7()函数,这个方法确实可以产生1原创 2017-08-09 22:52:38 · 3547 阅读 · 0 评论 -
蓄水池抽样算法 (Reservoir Sampling Algorithm)
蓄水池抽样算法简介蓄水池抽样算法是随机算法的一种,用来从N个样本中随机选择K个样本,其中N非常大(以至于N个样本不能同时放入内存)或者N是一个未知数。其时间复杂度为O(N),包含下列步骤 (假设有一维数组 S, 长度未知,需要从中随机选择 k 个元素, 数组下标从 1 开始), 伪代码如下:array R[k]; // resultinteger i, j;// fill the reser原创 2017-08-09 21:16:19 · 1029 阅读 · 2 评论 -
100层楼2个鸡蛋,如何得知鸡蛋能承受几层的撞击
有一栋楼共100层,一个鸡蛋从第N层及以上的楼层落下来会摔破, 在第N层以下的楼层落下不会摔破。给你2个鸡蛋,设计方案找出N,并且保证在最坏情况下, 最小化鸡蛋下落的次数。 我们先假设最坏情况下,鸡蛋下落次数为x,即我们为了找出N,一共用鸡蛋做了x次试验,那么,我们第一次应该从哪层楼往下扔鸡蛋呢?先让我们假设第一次是在第y层楼扔的鸡蛋,如果第一个鸡蛋第一次扔的时候就摔碎了,我们就剩下一个鸡蛋,要用它原创 2017-08-09 17:57:05 · 556 阅读 · 0 评论 -
KMP算法
本文主要参考July从头到尾理解KMP,所以,是一个热剩饭的过程,但好在自己对KMP算法有了更进一步的理解;问题引入现在我们面临一个这样的问题:有一个字符串S,和一个模式串P,现在要查找P在S中出现的位置,怎么查找呢? 先引入一个暴力求解法,假设并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置,则有: 1. 如果当前字符匹配成功(即S[i] == P[j]),则i++,j++,继续匹原创 2017-06-14 21:23:29 · 250 阅读 · 0 评论 -
红黑树及相关C++代码实现
近期在看STL源码,然后看到了关联性容器map和set的底层实现—红黑树,之前只是知道有这个名字的存在,近期花了两天的时间专门的研究了一下,有了一些初步的认识和了解。 本博客主要内容参考红黑树详细介绍红黑树概览红黑树是一种二叉查找树,但是会在每个节点数行增加一个存储位表示节点的颜色,可以是BLACK或者RED;通过对任何一条从根到叶子的路径上的各个节点着色的限制,红黑树确保没有一条路径会比其他原创 2017-06-09 20:21:36 · 273 阅读 · 0 评论