数据结构与算法
刘爱贵
中科院博士,TaoCloud首席科学家,专注软件定义存储,聚焦智能存储、分布式全闪存、信创存储方向。GlusterFS技术专家,长期从事存储领域研发工作,分布式存储资深理论研究与实践者。
展开
-
数值交换算法
三种方法:(1)使用临时变量 (2)不使用中间变量,仅使用加法运算 (3)不使用中间变量,使用异或XOR操作#include template void swap_var(T &a, T &b){ T tmp; tmp = a; a = b; b = tmp;}template void swap_add(T &a, T &b){ a = a - b; b = a + b;原创 2008-03-26 20:49:00 · 2518 阅读 · 4 评论 -
动态分配二维数组
C/C++程序中经常需要使用malloc / new 来生成数组。对于一维数组,这非常简单,而二维数组,动态分配要稍微复杂一点。这里给出动态分配二维数组的两种方法。 #include #include #define X 100#define Y 100// 方法一:数组空间不连续,两次调用mallocint ** alloc_2d_array_1(int ro原创 2009-05-09 15:54:00 · 2674 阅读 · 8 评论 -
KMP算法深度解析
摘要:KMP算法是字符串匹配的经典算法,由于其O(m+n)的时间复杂度,至今仍被广泛应用。大道至简,KMP算法非常简洁,然而,其内部却蕴含着玄妙的理论,以至许多人知其然而不知其所以然。本文旨在解开KMP算法的内部玄妙所在,希望能够有助于学习与理解。 1、KMP算法 一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此称之为KMP算法原创 2009-08-04 22:59:00 · 68594 阅读 · 40 评论 -
输出集合所有子集的算法
算法描述:把求子集运算转换为组合问题。假设集合中包含N个元素, 子集合数 = C(N, 0) + C(N, 1) + ... + C(N, N-1) + C(N, N),对于任一个子集合,可以用一个N元组表示,即 , 其中Si取值范围为(0, 1),0表示不该子集合不包含该元素,1表示该子集合包含该元素。因此,求子集合就转换成了罗列所示可能组合的算法。子集合数 = 2^n。 void原创 2009-06-08 20:49:00 · 6510 阅读 · 1 评论 -
字符串Hash函数评估
Hash查找因为其O(1)的查找性能而著称,被对查找性能要求高的应用所广泛采用。它的基本思想是:(1) 创建一个定长的线性Hash表,一般可以初始化时指定length;(2) 设计Hash函数,将关键字key散射到Hash表中。其中hash函数设计是最为关键的,均匀分布、冲突概率小全在它;(3) 通常采用拉链方法来解决hash冲突问题,即散射到同一个hash表项的关键字,以链表形式来表示(原创 2009-12-21 21:29:00 · 20323 阅读 · 27 评论 -
Rsync滚动校验算法
Rsync中使用了一种滚动检验(Rolling Checksum)算法,用于快速计算数据块的检验值。它是一种弱校验算法,采用的是Mark Adler的adler-32校验,给定X1, ..., Xn的校验值,X1以及Xn+1,可以快速地计算出X2, ..., Xn+1校验值。这样,就可以高效地计算数据块连续校验值,大幅减少checksum计算量。原创 2010-06-25 14:39:00 · 9512 阅读 · 10 评论 -
基于dedup技术的远程相似文件同步
Rsync是类Unix环境下的一个高效的远程文件复制(同步)工具,它通过著名的Rsync算法来优化流程,减少了数据通信量并提高文件传输效率。为了弥补Rsync的不足,利用dedup技术中的变长块数据切分算法,重新实现了一个远程相似文件同步原型dedup_sync。原创 2010-07-06 11:26:00 · 3636 阅读 · 3 评论 -
数据同步算法研究
基于Rsync和RDC算法思想并借助重复数据删除(De-duplication)技术,对数据同步算法进行深入研究与分析,并研发了原型系统。首先介绍rsync与RDC算法,然后详细描述算法设计与相应的数据结构,并重点分析文件分块、差异编码、文件同步算法,最后简介推拉两种应用模式。原创 2010-08-06 16:52:00 · 37418 阅读 · 109 评论 -
数据相似性检测算法
本文研究了数据相似性的计算方法,对Bloom filter和LCS两种常用相似性检测算法进行剖析、实现和分析比较。原创 2010-09-08 10:57:00 · 9565 阅读 · 17 评论 -
分布式文件系统名字空间实现研究
名字空间(Namespace)即文件系统文件目录的组织方式,是文件系统的重要组成部分,为用户提供可视化的、可理解的文件系统视图,从而解决或降低人类与计算机之间在数据存储上的语义间隔。目前树状结构的文件系统组织方式与现实世界的组织结构最为相似,被人们所广泛接受。因此绝大多数的文件系统皆以Tree方式来组织文件目录,包括各种磁盘文件系统(EXTx, XFS, JFS, Reiserfs, ZFS, Btrfs, NTFS, FAT32等)、网络文件系统(NFS, AFS, CIFS/SMB等)、集群文件系统(L原创 2010-11-07 18:57:00 · 14079 阅读 · 22 评论 -
深入理解Bloom Filter
Bloom Filter是1970年由Bloom提出的,最初广泛用于拼写检查和数据库系统中。近年来,随着计算机和互联网技术的发展,数据集的不断扩张使得 Bloom filter获得了新生,各种新的应用和变种不断涌现。Bloom filter是一个空间效率很高的数据结构,它由一个位原创 2011-07-13 12:40:43 · 13696 阅读 · 8 评论 -
HASHDB:一个简单的KeyValue存储系统原型
1、HashDB是什么?HashDB是一个简单的KeyValue存储系统原型,提供基本的二元组的数据存储与读取功能,亦即当前被广为推崇的NoSQL存储系统。最初想到设计这个小系统,完全是出于偶然。本人维护着一个轻量级的开源重复数据删除小工具deduputil,它基于块级对文件目录原创 2011-08-08 22:31:09 · 17106 阅读 · 33 评论 -
相似数据检测算法
相似数据检测算法对给定的一对数据序列计算两者之间的相似度([0,1], 1表示完全相同)或距离([0, ), 0表示完全相同),从而度量数据之间的相似程度。相似数据检测在信息科学领域具有非常重要的应用价值,比如搜索引擎检索结果的聚类与排序、数据聚类与分类、Spam检测、论文剽窃检测、重复数据删除、Delta数据编码等应用。正是由于它的重要性,近年来成为了研究的重点,不断有新检测方法涌现并得到评估。原创 2011-10-22 22:21:40 · 22145 阅读 · 33 评论 -
Windows性能计数器
一、性能计数器概述 性能监视,是Windows NT提供的一种系统功能。Windows NT一直以来总是集成了性能监视工具,它提供有关操作系统当前运行状况的信息,针对各种对象提供了数百个性能计数器。性能对象,就是被监视的对象,典型例子有Processor、Process、Memory、TCP/UDP/IP/ICMP、PhysicalDisk等。计数器通常提供操作系统、应用程序、服务、驱动程序等的原创 2009-03-30 21:03:00 · 20853 阅读 · 5 评论 -
常用排序算法及C例程
排序(Sorting)是计算机程序设计中的一个重要而且常用的操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。下面介绍最为常用的几种排序算法,并进行简单地比较分析以及C语言例程。这些C例程都是笔者在学习和工作中慢慢积累起来的,应该说还是有些用处的。(刘爱贵 / Aiguille.LIU)1、快速排序算法 快速排序是目前公认的最好排序算法,是一种基于分治技术的重要原创 2008-03-27 13:10:00 · 2162 阅读 · 0 评论 -
个人所得税计算
VC实现的小工具:http://goc.ac.cn/liuag/html/software_calculatorx.html计算公式很简单,程序一看就明白。PS:那时个税起征点是1600,现在都2000了,^-^//根据税前工资和个税起征点计算所得税double calculateTax(double presalary, double base){ double tax; d原创 2008-03-28 14:52:00 · 2300 阅读 · 0 评论 -
几个小算法
介绍几个小算法:数制转换、数据交换、最大公约数、N次方快速算法、KMP算法。这几个算法在相关数据结构和算法书上都有介绍,这里给出C语言实现例子,供大家参考。(刘爱贵 / Aiguille.LIU)1、数制转换算法十进制数N转换为d进制数,根据公式 N = (N div d) * d + N mod d实现 ,堆栈的典型应用。C语言实现如下:#include "./stack.h"#incl原创 2008-03-27 13:05:00 · 1642 阅读 · 1 评论 -
N皇后问题求解算法
大学时C++程序设计课程的作业题目。呵呵!N皇后问题(含八皇后问题的扩展,规则同八皇后):在N*N的棋盘上,放置N个皇后,要求每一横行每一列,每一对角线上均只能放置一个皇后,求解可能的方案及方案数。下面程序利用堆栈数据结构,使用回溯法求出所有可行解。/* Copyright (c) 2006, Computing Center of IHEP, Beijing, China Aigui原创 2008-03-29 13:29:00 · 3474 阅读 · 3 评论 -
中缀和后缀表达式求值算法
表达式求值是程序设计语言编译中的一个最基本问题,它的实现是堆栈应用的一个重要例子。程序中使用常用、直观的“算符优先法”实现。/* Copyright (c) 2006, 刘爱贵, Aigui.LIU@ihep.ac.cn, Computing Center of IHEP, Beijing, China */#include "stdafx.h"#include "iostream.h"原创 2008-03-29 13:32:00 · 2508 阅读 · 0 评论 -
背包问题优先队列分枝限界算法
这个大概是算法课上的作业题。所谓的背包问题,可以描述如下:一个小偷打劫一个保险箱,发现柜子里有N类不同大小与价值的物品,但小偷只有一个容积为M的背包来装东西,背包问题就是要找出一个小偷选择所偷物品的组合,以使偷走的物品总价值最大。这个问题的求解有很多种方法,本程序使用分枝限界法求解。/* Copyright (c) 2006, 刘爱贵, Aigui.LIU@ihep.ac.cn, C原创 2008-03-29 13:35:00 · 3580 阅读 · 0 评论 -
一种五子棋算法
学习算法分析设计时练手所写的,主要是自娱。算法采用极大极小剪枝博弈算法,人工智能还凑和,但BUG多多,有时间再改改。设计主要包括:数据结构、估值函数、胜负判断、搜索算法VC实现:http://goc.ac.cn/liuag/html/software_fivechess.html1、数据结构//记录每步棋,可以建立链表用来进行悔棋、后退(本程序没有实现)struct Step{原创 2008-03-29 13:39:00 · 16511 阅读 · 7 评论 -
二叉排序树
二叉排序树(Binary Sort Tree)中,任意结点x,其左子树所有结点的值不大于key[x] ,其右子树的所有结点值不小于key[x]。BST中的操作SEARCH、MINIMUM、MAXIMUM、SUCCESSOR、 PREDECCESSOR、INSERT、DELETE都可以在O(h)内完成,h为树的高度。BST可以用作字典,也可以用作优先队列。BST的C语言实现和操作实例如下:#原创 2008-03-29 13:45:00 · 1936 阅读 · 0 评论 -
TRIE树
一个能够实现查找元素、增加元素和删除元素三种操作的数据结构称为字典。TRIE树,又称键树,可以用来构造字典,适合所有元素都是由字母和数字标记的情形。下面是TRIE树的一种C++实现:#include #include #include using namespace std;const int num_chars = 26;class Trie { protected: str原创 2008-03-29 13:46:00 · 2550 阅读 · 3 评论 -
递归算法
递归是设计和描述算法的一种有力的工具,它在复杂算法的描述中被经常采用。采用递归描述的算法通常有这样的特征:为求解规模为N的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规模较大问题的解。特别地,当规模N=1时,能直接得解。(引自:http://blog.chi原创 2008-03-27 14:37:00 · 1629 阅读 · 1 评论 -
C程序中的存储分配
C程序中的存储分配(刘爱贵 - Aiguille.LIU) C程序设计中,经常需要使用malloc/free动态管理内存,在需要的时候向操作系统申请空间,适合的时候释放不再使用的空间。那么,C库中malloc/free是如何实现的呢?参考"The C Programming Language",我们设计了自己的存储分配程序。 由于程序中某些地方可能不通过malloc调用申请空间,因此,ma原创 2008-04-12 17:55:00 · 3162 阅读 · 4 评论 -
散列表设计
散列表设计(刘爱贵 - Aiguille.LIU)1、基本概念 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。2、常用的构造散列函数的方法 散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数原创 2008-04-14 13:09:00 · 5761 阅读 · 6 评论 -
Glusterfs全局统一命名空间
全局统一命名空间Glusterfs采用了全局统一命名空间设计,将磁盘和内存资源聚集成一个单一的虚拟存储池进行管理,并在此命名空间中使用NFS/CIFS等标准协议来访问应用数据。与其他分布式文件系统有所不同的是,GlusterFS中没有专用的元数据服务器,而是独特地采用无元数据服务的设计,取而代之使用算法来定位文件,元数据和数据没有分离而是一起存储。这使得数据访问完全并行化,从而实现真正的线性性原创 2011-12-02 21:20:19 · 10814 阅读 · 18 评论