随笔分类 - 数据结构与算法
摘要:LRU缓存设计是一个能够考察许多知识点以及实际编程能力的题目,因为我们在实际工作中是很有可能会去自己写一个LRU算法的简单缓存。本题是LeetCode的第 146 题。LRU——即 Least Recently Used,淘汰最近最少使用的元素的算法。考察的主要内容包括: LRU算法的原理与思想 具
阅读全文
摘要:在多核系统中,会存在多个CPU核竞争同一资源的情形,这就必须有一些机制来保证在竞争中不会出现错误,即同步互斥机制。这里主要针对同步互斥原语之一的自旋锁进行一点分析和记录。上图为一个多核系统的中断部分,很显然中断部分会存在许多竞争相关问题。自旋锁(Spinlock) 自旋锁是用来在多处理器环境...
阅读全文
摘要:操作系统中,对共享资源的访问需要有同步互斥机制来保证其逻辑的正确性,而这一切的基础便是原子操作。| 原子操作(Atomic Operations): 原子操作从定义上理解,应当是类似原子的,不可再分的操作;然而实际上稍有不同,较为准确的定义应当是:不可被打断的一个或一系列操作。 在单处理器系统...
阅读全文
摘要:前段时间在园子里看到一篇讲Boyer-Moore算法原理的文章http://kb.cnblogs.com/page/176945/,写的很详细,于是在这里自己写个C语言的实现,权当是练手吧。 基本思路是每次从模式串的最右端开始匹配,如果后缀不匹配,模式串可以快速地后移,从而快速地匹配字符串。要用一个数组right[],来存储失配时模式串的移动步数。数组的大小是256,即扩展的ASCII码表大小(即256个字符)。若对应字符不存在于模式串中,则赋值-1,否则表示字符出现在模式串中,查找失配时,模式串向右移动的步数。应该还有优化的空间,暂时没想了。 分成两个文件,一个.h文件,一个.c文件...
阅读全文
摘要:在大数据处理中,用字典树来解决一些有公共前缀或者是自动完成功能的词汇存储时,经常能够用到,而且十分方便,总能在O(n)时间内查找到相应节点。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。 字典树的每个节点有26个孩子节点,节点依照其位置,代表不同的字母,而节点中存储的key信息就是能够到达这个节点的公共前缀数目,即从根节点到此节点的路径上字母连起来构成的公共前缀单词的数目。但如果存储的单词数目庞大,而且有公共前缀的不多,则使用字典树将十分耗费空间,呈指数增长~~ 实现的数据结构及操作如下: 1 #ifndef _STDIO_H...
阅读全文
摘要:堆,实际上是一颗完全二叉树,且满足性质:其根节点的关键字不小于(或不大于)其左右孩子节点。 即满足key[i]>=key[2i+1]&&key[i]>=key[2i+2]的称为大根堆;满足key[i]<=key[2i+1]&&key[i]<=key[2i+2]的称为小根堆()。 以大根堆为例,堆排序算法就是利用了堆的根节点一定是堆中最大的数的结构特点,每次将根节点的关键字和最后一个节点交换,从而得到已排序的部分,和未排序的剩余部分,再将剩余部分调整为堆,重新得到根节点,如此递归调用,直到堆中所有元素已然有序。 举个例子,下图为一个5个节点
阅读全文

浙公网安备 33010602011771号