随笔分类 -  数据结构与算法

摘要:Epoch Based Reclamation Epoch Based Reclamation epoch based reclamation 算法参考文档: http://www.cs.toronto.edu/~tomhart/papers/tomhart_thesis.pdf https://a 阅读全文
posted @ 2022-10-21 23:56 如果的事 阅读(559) 评论(0) 推荐(0) 编辑
摘要:Hazard Pointer 先看个例子: int *p = new int(2);void reader() { if (nullptr != p) { //nullptr是C++11中引入的 cout << *p << endl; }}void writer() { delete p; p = 阅读全文
posted @ 2022-05-06 15:18 如果的事 阅读(171) 评论(0) 推荐(0) 编辑
摘要:简单排序 冒泡排序 冒泡排序,类似于水中冒泡,较大的数沉下去,较小的数慢慢冒起来,假设从小到大,即为较大的数慢慢往后排,较小的数慢慢往前排。 直观表达,每一趟遍历,将一个最大的数移到序列末尾。 void bubbleSort(int* array, int len) { for (int n = 0 阅读全文
posted @ 2020-12-20 16:44 如果的事 阅读(114) 评论(0) 推荐(0) 编辑
摘要:LRU算法 很多Cache都支持LRU(Least Recently Used)算法,LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰。 LRU Cache一般支持两个操作: get 阅读全文
posted @ 2017-06-21 16:27 如果的事 阅读(858) 评论(0) 推荐(0) 编辑
摘要:位运算 判断字节序 问题描述:判断一台机器是大尾顺序还是小尾顺序。 整数的二进制中1的个数 判断是否为2的幂 如果一个数是2的N次幂,那么它的二进制表示中只有一个1。 判断是否为3的幂 如果是判断一个int类型是否是3的幂,在int范围内3^19=1162261467是最大的一个幂,3^20就超出了 阅读全文
posted @ 2016-06-08 14:23 如果的事 阅读(322) 评论(0) 推荐(0) 编辑
摘要:AVL树 在二叉查找树(BST)中,频繁的插入操作可能会让树的性能发生退化,因此,需要加入一些平衡操作,使树的高度达到理想的O(logn),这就是AVL树出现的背景。注意,AVL树的起名来源于两个发明者:Adel'son-Vel'skii 和 Landis。 AVL树除了具备BST树的基本特征之外, 阅读全文
posted @ 2016-02-04 15:51 如果的事 阅读(574) 评论(1) 推荐(1) 编辑
摘要:Bitcask 存储模型Bitcask 是一个日志型、基于hash表结构的key-value存储模型,以Bitcask为存储模型的K-V系统有 Riak 和 beansdb 新版本。日志型数据存储何谓日志型?就是append only,所有写操作只追加而不修改老的数据,就像我们的各种服务器日志一样。... 阅读全文
posted @ 2015-06-16 15:09 如果的事 阅读(5689) 评论(0) 推荐(1) 编辑
摘要:LSM存储模型数据库有3种基本的存储引擎:哈希表,支持增、删、改以及随机读取操作,但不支持顺序扫描,对应的存储系统为key-value存储系统。对于key-value的插入以及查询,哈希表的复杂度都是O(1),明显比树的操作O(n)快,如果不需要有序的遍历数据,哈希表就是不错的选择;B+树,支持单条... 阅读全文
posted @ 2015-06-11 13:16 如果的事 阅读(1995) 评论(0) 推荐(0) 编辑
摘要:跳表 跳表(skip list)是一种随机化数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作需要O(lgN)平均时间); 跳表的构造过程: 给定一个有序链表; 选择链表中最大和最小的元素,然后从其它元素中按照一定算法随机选出一些元素,将这些元素组成有序链表;这个新的链表称为一层,原 阅读全文
posted @ 2015-03-24 18:38 如果的事 阅读(560) 评论(0) 推荐(1) 编辑
摘要:矩阵遍历 顺时针遍历 如何顺时针打印一个矩阵的元素呢(按照从外向里以顺时针的顺序依次打印出每一个数字),例如:如果输入如下矩阵: 1 2 3 45 6 7 89 10 11 1213 14 15 16 则依次打印出数字:1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 阅读全文
posted @ 2015-01-22 11:28 如果的事 阅读(1371) 评论(1) 推荐(0) 编辑
摘要:约瑟夫环n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。很自然的想法是我们用一个数据结构来模拟这个圆圈。在常用... 阅读全文
posted @ 2014-12-16 18:20 如果的事 阅读(341) 评论(0) 推荐(0) 编辑
摘要:栈与队列 颠倒一个栈的元素顺序 问题:假设有一个栈{1,2,3,4,5,6},6是栈顶,1是栈底,现在要把这个栈中的元素颠倒一下。 思路:最简单的办法当然是把栈中的元素依次pop到一个数组中,然后把这个数组再push回栈里面即可,但这样需要O(n)的辅助空间。 下面介绍一种仅使用O(1)辅助空间的算 阅读全文
posted @ 2014-11-27 18:07 如果的事 阅读(1096) 评论(0) 推荐(0) 编辑
摘要:BST树的经典问题 首先构造如下一棵二元查找树(BST树): C++代码实现: typedef struct _BSTreeNode { int value; struct _BSTreeNode *left; struct _BSTreeNode *right; } BSTreeNode; sta 阅读全文
posted @ 2014-11-26 16:11 如果的事 阅读(254) 评论(0) 推荐(0) 编辑
摘要:数组常见算法题连续子数组的最大和问题描述:输入一个整型数组,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和,求所有子数组和的最大值。例如输入的数组为1,-2,3,10,-4,7,2,-5,和最大的子数组为3,10,-4,7,2,因此输出为该子数组的和18。int max_sub(in... 阅读全文
posted @ 2014-11-25 18:39 如果的事 阅读(4765) 评论(0) 推荐(0) 编辑
摘要:链表的经典问题 如何判断两个单链表是否相交,如果相交,找出交点(两个链表都不存在环) 如果两个单链表相交,那应该呈“Y”字形,也就是从交点以后的部分是两个链表的公共节点。 所以,判断是否相交只要看两个链表的最后一个节点是否为同一个即可。 那么如何找到交点呢?设两个单链表的长度分别为L1、L2,(假设 阅读全文
posted @ 2014-11-24 15:10 如果的事 阅读(1304) 评论(0) 推荐(0) 编辑
摘要:二叉堆 我们知道堆栈是一种LIFO(后进先出)结构,队列是一种FIFO(先进先出)结构,而二叉堆是一种最小值先出的数据结构,因此二叉堆很适合用来做排序。 二叉树的性质:二叉堆是一棵完全二叉树,且任意一个结点的键值总是小于或等于其子结点的键值, 二叉堆采用数组来存储(按广度优先遍历的顺序),而没有像普 阅读全文
posted @ 2014-11-19 19:00 如果的事 阅读(2127) 评论(0) 推荐(0) 编辑
摘要:二叉查找树 二叉查找树(binary search tree, BST)的特征: 1、所有节点存储一个关键字; 2、非叶子节点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树(查找二叉树的中序遍历是有序序列); 3、实际使用的二叉查找树一般都加入了平衡算法(balanced binary 阅读全文
posted @ 2014-11-19 14:58 如果的事 阅读(909) 评论(0) 推荐(0) 编辑
摘要:海量数据处理相关面试题注意:本文只是本人对http://blog.csdn.net/v_july_v/article/details/7382693的一个阅读笔记。引言一般来说,STL容器分两种,序列式容器(vector/list/deque/stack/queue/heap);关联式容器(set/... 阅读全文
posted @ 2014-11-04 21:26 如果的事 阅读(1166) 评论(0) 推荐(0) 编辑
摘要:BloomFilter 与 CuckooFilter Bloom Filter Bloom Filter是一种空间效率很高的随机数据结构,它的原理是,当一个元素被加入集合时,通过K个相互独立的Hash函数将这个元素映射成一个位阵列(Bit array)中的K个点,把它们置为1。检索时,我们只要看看这 阅读全文
posted @ 2014-11-04 17:32 如果的事 阅读(7337) 评论(0) 推荐(0) 编辑
摘要:字符串匹配算法 KMP算法 KMP算法是由D.E.Knuth,J.H.Morris和V.R.Pratt提出的。 首先,要了解两个概念: 前缀 (prefix),指除了最后一个字符以外,一个字符串的全部头部组合; 后缀 (suffix),指除了第一个字符以外,一个字符串的全部尾部组合。 "部分匹配值" 阅读全文
posted @ 2014-09-27 19:08 如果的事 阅读(303) 评论(0) 推荐(0) 编辑