常用数据结构、算法、设计模式
编程小问号
这个作者很懒,什么都没留下…
展开
-
C++编程必备神器STL——常用算法
C++标准函数库中,为我们提供了一个algorithm库,里面包含了十分多的常用算法,下面我来做一个小小的总结非修改序列操作adjacent_find 查找两个相邻(Adjacent)的等价(Identical)元素all_of (C++11) 检测在给定范围中是否所有元素都满足给定的条件any_of (C++11) 检测在给定范围中是否存在元素满足给定条件count 返...转载 2018-09-18 15:32:42 · 304 阅读 · 0 评论 -
从Cerber勒索软件中学习murmurhash算法
文章难易度:★★★文章阅读点/知识点:算法分析文章作者:降草文章来源:i春秋本文参与i春秋社区原创文章奖励计划,未经许可禁止转载!近期,大量国内用户遭受到cerber勒索软件的侵害,cerber作为新起的勒索软件家族,大有后来居上的姿态,网上也有数篇对于cerber勒索软件的行为的分析。这款勒索软件,使用rsa非对称加密加密用户的文件,在没有私钥的情况下,基本上转载 2016-12-05 11:24:12 · 1956 阅读 · 1 评论 -
跳跃表 Skip List
最近在学习redis,这时才知道了skip list,结合Mit 算法导论 lecture 12,在奋斗了2个早上的时间后有了下面的东东。对于我们熟悉的binary search来说,我们需要能够做到random access才行。但是在普通的link这种数据结构中却不能做到。而这种情况下我们有很多类似的工具比如heap,tree,b tree,red-black tree。等等类转载 2016-07-26 17:41:00 · 474 阅读 · 0 评论 -
浅析SkipList跳跃表原理及代码实现
转载请注明:http://blog.csdn.net/ict2014/article/details/17394259SkipList在leveldb以及lucence中都广为使用,是比较高效的数据结构。由于它的代码以及原理实现的简单性,更为人们所接受。我们首先看看SkipList的定义,为什么叫跳跃表?“ Skip lists are data structures转载 2016-07-26 17:10:32 · 557 阅读 · 0 评论 -
数据结构和算法系列17 图
数据结构和算法系列17 图阅读目录一,图的定义二,图相关的概念和术语三,图的创建和遍历四,最小生成树和最短路径五,算法实现这一篇我们要总结的是图(Graph),图可能比我们之前学习的线性结构和树形结构都要复杂,不过没有关系,我们一点一点地来总结,那么关于图我想从以下几点进行总结:1,图的定义?2,图相关的概念和术语?3,图的创建和遍历?4,最转载 2016-07-22 18:07:18 · 508 阅读 · 0 评论 -
并查集及其在最小生成树中的应用
并查集是一种用途广泛的数据结构,能够快速地处理集合的合并和查询问题,并且实现起来非常方便,在很多场合中都有着非常巧妙的应用,。本文首先介绍并查集的定义、原理及具体实现,然后以其在最小生成树算法中的一个经典应用为例讲解其具体使用方法。一 并查集原理及实现并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。并查集在使用中通常以森林来表示,每个集合组织转载 2016-01-14 16:08:26 · 539 阅读 · 0 评论 -
并查集详解
并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了。以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定。不分享出来真是对不起party了。(party:我靠,关我嘛事啊?我跟你很熟么?)来看一个实例,杭电1232畅通工程首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性问题。比如随意给你两个点转载 2016-01-14 15:55:32 · 378 阅读 · 0 评论 -
精讲哈夫曼压缩算法
哈夫曼压缩算法编码是无损压缩当中最好的方法。它使用预先二进制描述来替换每个符号,长度由特殊符号出现的频率决定。常见的符号需要很少的位来表示,而不常见的符号需要很多为来表示。哈夫曼算法在改变任何符号二进制编码引起少量密集表现方面是最佳的。然而,它并不处理符号的顺序和重复或序号的序列。哈夫曼压缩算法之原理我不打算探究哈夫曼编码的所有实际的细节,但基本的原理是为每个符号找到新的二转载 2016-01-13 09:58:35 · 4639 阅读 · 0 评论 -
c语言:统计整数二进制表示中1的个数(汉明重量)
问题描述:对于一个字节的无符号整型变量,求其二进制表示中1的个数。第一次见到这个问题应该是icephone第一次例会的时候,问题虽然简单,但也值得深思。后来查阅资料的时候才知道这个问题有个正式的名字叫Hamming_weight,也被一些公司当做面试题。下面通过几个不同阶段的算法,谈谈这个问题。一、逐个数刚刚接触这个问题的时候是上学期转载 2015-12-22 18:10:04 · 1282 阅读 · 0 评论 -
陌生但默默一统江湖的MurmurHash
看Jedis的主键分区哈希时,看到了名字很萌很陌陌的MurmurHash,谷歌一看才发现Redis,Memcached,Cassandra,HBase,Lucene都用它。关于Hash,我之前只知道MD5,SHA1,SHA256还有Java自己的hashCode(),学校里怎么没教MurmurHash啊? 哦,原来这算法是2008年才被发明的,与MD5这些讲究安全性的摘要算法比,Redis转载 2016-12-05 11:31:48 · 14720 阅读 · 0 评论 -
缓存算法
原文地址:http://www.leexiang.com/cache-algorithm引言 我们都听过 cache,当你问他们是什么是缓存的时候,他们会给你一个完美的答案,可是他们不知道缓存是怎么构建的,或者没有告诉你应该采用什么标准去选择缓存框架。在这边文章,我们会去讨论缓存,缓存算法,缓存框架以及哪个缓存框架会更好。面试 “缓存就是存贮数据(使用频繁的数据转载 2016-12-05 14:02:06 · 420 阅读 · 0 评论 -
Redis、Memcached、Guava、Ehcache中的算法
缓存那些事,一是内存爆了要用LRU(最近最少使用)、LFU(最少访问次数)、FIFO的算法清理一些;二是设置了超时时间的键过期便要删除,用主动或惰性的方法。在看所有的细节之前,可以看一篇相当专业的《缓存算法》,世界真宽阔,算法真奇妙。 1. LRU简单粗暴的Redis今天看Redis3.0的发行通告里说,LRU算法大幅提升了,就翻开源码来八卦一下,结果哭笑不转载 2016-12-05 14:14:07 · 389 阅读 · 0 评论 -
集群设计中的一些思考
最近在调研集群部署中高可用性,如何能保证高可用性,部署简单明了,博客 https://www.cnblogs.com/leihenqianshang/articles/5623858.html 中给了我一些提示 从最开始单节点的设计: 到两个节点主备设计: 再到三个节点设计: 到四个节点时的设计: 到多节点的中心化设计: 最后是多节点的主备设计: 每一次不同的设计不代表都是很好的设计原创 2018-01-03 15:40:03 · 661 阅读 · 0 评论 -
基于双数组Trie的词典查询算法
转载 2017-09-25 17:51:47 · 539 阅读 · 0 评论 -
Linux kernel 分析之二十一:定时器-巧妙的定时器算法
内核中经常要用到各种定时器。比如nanosleep()系统调用,让当前进程睡眠一段时间,再把它唤醒。即在expires时刻(以时钟滴答为单位),自动调用wake_up_process。最直接的思路是定义一个定时器,里面有function(函数指针),data(函数参数),expires(调用时刻)。然后排成一个链表。每次时钟中断发生时,扫描整个链表,发现有触发的定时器,就调用function(da转载 2017-01-26 17:15:04 · 507 阅读 · 0 评论 -
堆排序—大根堆,小根堆
1.小根堆若根节点存在左子女则根节点的值小于左子女的值;若根节点存在右子女则根节点的值小于右子女的值。2.大根堆若根节点存在左子女则根节点的值大于左子女的值;若根节点存在右子女则根节点的值大于右子女的值。3.结论(1)堆是一棵完全二叉树(如果公有h层,那么1~h-1层均满,在h层连续缺失若干个右叶子)。(2)小根堆的根节点的值是最小值,大根堆的根节点的值是最大值。(3)转载 2017-02-04 15:27:30 · 11248 阅读 · 0 评论 -
MD5科普(二):MD5算法详解/如何改进MD5算法?
原文链接:https://www.6zou.net/tech/md5_how_to_do.html一、MD5算法的实现MD5算法简述:MD5是输入不定長度信息,输出固定長度128-bits的演算法。经过程序流程,生成四个32位数据,最后联合起来成为一个128-bits散列。基本方式为,求余、取余、调整长度、与链接变量进行循环运算。MD5相对MD4所作转载 2016-12-08 15:56:08 · 2823 阅读 · 0 评论 -
<翻译> 如何利用Bloom Filter在Java中构建大规模基于内存的缓存
原文地址: http://www.javacodegeeks.com/2014/07/how-to-use-bloom-filter-to-build-a-large-in-memory-cache-in-java.html缓存(Cache)是用来解决当下软件性能问题时需要考虑的一个很重要的手段。 你的程序可能有密集的CPU操作,而你却不想一遍又一遍的折磨CPU。 相反, 你会将结果抽取出转载 2016-12-07 16:48:14 · 1715 阅读 · 0 评论 -
LevelDB:Bloom源码精读——数据结构
原文地址:https://yq.aliyun.com/articles/5833一、原理分析BloomFiler(布隆过滤器)是由Howard Bloom在1970年提出的二进制向量数据结构,怎么来理解“二进制向量数据结构”?我们将其分解成“二进制”、“向量”和“数据结构”来分别理解。1、二进制:用0和1来表示的数。2、向量:是指位向量或者比特向量,即向量的转载 2016-12-07 16:52:41 · 576 阅读 · 0 评论 -
Bloom Filter概念和原理
Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom转载 2016-12-07 16:46:53 · 371 阅读 · 0 评论 -
动态规划算法
一、基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略 基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能转载 2015-12-22 14:22:22 · 490 阅读 · 0 评论 -
计算机科学中最重要的32个算法
计算机科学中最重要的32个算法奥地利符号计算研究所(Research Institute for Symbolic Computation,简称RISC)的Christoph Koutschan博士在自己的页面上发布了一篇文章,提到他做了一个调查,参与者大多数是计算机科学家,他请这些科学家投票选出最重要的算法,以下是这次调查的结果,按照英文名称字母顺序排序。A* 搜索算法—转载 2015-12-22 14:08:36 · 501 阅读 · 0 评论 -
时间复杂度和空间复杂度详解
算法的时间复杂度和空间复杂度合称为算法的复杂度。1.时间复杂度(1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或转载 2015-11-30 16:54:28 · 970 阅读 · 0 评论 -
小根堆
首先什么是小根堆:(1)它是一颗完全二叉树(2)任意一个节点均小于或等于其左右子节点的关键码(大根堆相反就是了)因此可以得知,当前树形结构的根节点就是当前整个树形结构最小的节点。。。至于说这种堆结构有什么作用:(1)以前本科的时候上数据结构课的时候就有讲过堆排序,好像还不错,O(nlogn)的复杂度(2)可以用来构造优先权队列。。。。(3)在libevent库中转载 2014-06-26 17:32:28 · 3860 阅读 · 0 评论 -
红黑树
介绍另一种平衡二叉树:红黑树(Red Black Tree),红黑树由Rudolf Bayer于1972年发明,当时被称为平衡二叉B树(symmetric binary B-trees),1978年被Leonidas J. Guibas 和Robert Sedgewick改成一个比较摩登的名字:红黑树。红黑树和之前所讲的AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,转载 2014-06-26 14:57:00 · 398 阅读 · 0 评论 -
一致性 hash
consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees中被提出,目前在 cache 系统中应用越来越广泛; 1 基本场景比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object转载 2014-06-26 13:29:08 · 408 阅读 · 0 评论 -
stl 容器比较
List封装了链表,Vector封装了数组, list和vector得最主要的区别在于vector使用连续内存存储的,他支持[]运算符,而list是以链表形式实现的,不支持[]。Vector对于随机访问的速度很快,但是对于插入尤其是在头部插入元素速度很慢,在尾部插入速度很快。List对于随机访问速度慢得多,因为可能要遍历整个链表才能做到,但是对于插入就快的多了,不需要拷贝和移动数据,只需要改变转载 2014-06-26 16:21:14 · 996 阅读 · 0 评论 -
thttpd源码小分析之Reactor pattern
这篇文章非常粗略地讨论thttpd的工作pattern: Reactor.关于pattern和model的区别,这里不多解释,参考这个说法: M(odel)-VC pattern.关于pattern的更多资料,参考 http://www.enterpriseintegrationpatterns.com/ .什么是ReactorReactor又称Dispatcher,用于同步IO,转载 2014-06-26 00:06:02 · 822 阅读 · 0 评论 -
深入分析 Linux 内核链表
本文详细分析了 2.6.x 内核中链表结构的实现,并通过实例对每个链表操作接口进行了详尽的讲解。一、 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指针将一系列数据节点连接成一条数据链,是线性表的一种重要实现方式。相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或删除数据。链表的开销主要是访问转载 2014-06-26 17:09:27 · 393 阅读 · 0 评论 -
二叉树
登录 | 注册收藏成功确定收藏失败,请重新收藏确定标题标题不能为空网址标签 摘要公开取消收藏 全部设为已读查看所有通知转载 2014-06-26 15:55:25 · 530 阅读 · 0 评论 -
hash算法 (hashmap 实现原理)
Hash ,一般翻译做“ 散列” ,也有直接音译为“ 哈希” 的,就是把任意长度的输入(又叫做预映射, pre-image ),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。HASH转载 2014-06-25 12:24:25 · 532 阅读 · 0 评论 -
数据库系统——基于索引的存储结构
1. 采用索引的动机Heap file支持大规模顺序扫描数据.理论上来说,heap file的这个特性足以实现所有SQL中的查询操作。但是,实际上它的效率将会非常差。在本篇文章中,我们讨论了一些简单的技巧,去提升数据扫描(record scan)以及数据查找(record search)的效率。共同的主题将是:Create secondary data storage to min转载 2015-05-08 12:24:14 · 565 阅读 · 0 评论 -
最小堆/哈希表/二叉树/平衡二叉树/红黑树的意义
接触堆数据结构是在排序里面讲的,空间复杂度O(1),时间复杂度O(NlogN),但是在实践中还是不如快速排序(好像快速排序可以更好的利用硬件特性)。堆 的意义就在于:最快的找到最大/最小值,在堆结构中插入一个值重新构造堆结构,取走最大/最下值后重新构造堆结构 其时间复杂度为O(logN),而其他方法最少为O(N).堆实践中用途不在于排序,其主要用在调度算法中,比如优先级调度,每次取优先级最高的,时转载 2015-04-28 11:39:25 · 2036 阅读 · 0 评论 -
数据库系统——B+树索引
1. B+树索引概述在上一篇文章中,我们讨论了关于index的几个中重要的课题:A) index是保存在磁盘上的一种数据结构,用于提高查询或是扫描record的速度。B) 排序索引树通过保存page的指针加速record的查找。(ISAM)C) 维护排序索引树的代价很高,因此,ISAM通过创建overflow page来解决这个问题,但是过多的overflow page会使查询性能转载 2015-05-08 12:21:10 · 687 阅读 · 0 评论 -
微博消息队列架构分析
size=6][size=7][size=5]最近一两年,大部分系统的数据流由基于日志的离线处理方式转变成实时的流式处理方式,并逐渐形成几种通用的使用方式,以下介绍微博的消息队列体系。(点击图片全屏缩放浏览)功能模块当前的主要消息队列分成如图3部分:1、feed信息流主流程处理,图中中间的流程,通过相关MQ worker将数据写入cache、Redis及转载 2015-08-18 14:55:59 · 2169 阅读 · 1 评论 -
业务系统需要什么样的ID生成器
18 January 2015ID 生成器在微博我们一直叫发号器,微博就是用这样的号来存储,而我微博里讨论的时候也都是以发号器为标签。它的主要目的确如平常大家理解的“为一个分布式系统的数据object产生一个唯一的标识”,但其实在一个真实的系统里可能也可以承担更多的作用。概括起来主要有以下几点:唯一性时间相关粗略有序可反解可制造下面我会分别讲每个作用后面的考虑和权衡,也会对比介转载 2015-08-18 14:15:10 · 565 阅读 · 0 评论 -
【算法总结】堆及堆排序总结
【前言】堆排序是什么?堆排序的核心是将数组构建成为一个堆,然后从堆顶逐个逐个数字获取,堆分成最大堆(大顶堆)及最小堆(小顶堆)。下面还是先说明什么是堆。堆是一颗完全二叉树。---什么是完全二叉树?百度百科--完全二叉树简而言之,一个二叉树是饱满的---即二叉树都满了,即使没有饱满,那么上一层都是饱满,最后一层叶子节点从左向右排列。转载 2015-08-03 18:18:41 · 2995 阅读 · 0 评论 -
GeoHash核心原理解析
http://www.cnblogs.com/LBSer/p/3310455.html引子 机机是个好动又好学的孩子,平日里就喜欢拿着手机地图点点按按来查询一些好玩的东西。某一天机机到北海公园游玩,肚肚饿了,于是乎打开手机地图,搜索北海公园附近的餐馆,并选了其中一家用餐。 饭饱之后机机开始反思了,地图后台如何根据自己所在位置查询来查询附近餐馆的呢?苦思冥想了半天,机机想出了个转载 2015-08-27 16:32:21 · 572 阅读 · 0 评论 -
服务器负载均衡算法
3.1 服务器负载均衡算法BIG-IP是一台对流量和内容进行管理分配的设备。它提供10种灵活的算法将数据流有效地转发到它所连接的服务器群。而面对用户,只是一台虚拟服务器。用户此时只须记住一台服务器,即虚拟服务器。但他们的数据流却被BIG-IP灵活地均衡到所有的服务器。这10种算法包括:轮询(Round Robin):顺序循环将请求一次顺序循环地连接每个服务器。当其中某个服务器发生第转载 2015-07-30 13:59:15 · 1243 阅读 · 0 评论 -
统治世界的十大算法
软件正在统治世界。而软件的核心则是算法。算法千千万万,又有哪些算法属于“皇冠上的珍珠”呢?Marcos Otero 给出了他的看法。什么是算法?通俗而言,算法是一个定义明确的计算过程,可以一些值或一组值作为输入并产生一些值或一组值作为输出。因此算法就是将输入转为输出的一系列计算步骤。—Thomas H. Cormen,Chales E. Leiserson,算法入门转载 2015-08-07 23:32:11 · 732 阅读 · 0 评论