
算法与数据结构
文章平均质量分 75
IT_Linux
Linux world
展开
-
全排列
下面程序在Dev-C环境运行通过:#include #include using namespace std;int n = 0;void swap(char *a, char *b){ int m; m = *a; *a = *b; *b = m;}void fun(char *list, int k, int m){ int i;原创 2012-11-09 20:34:52 · 453 阅读 · 0 评论 -
AVL树C语言完整实现
AVL树的介绍见http://blog.youkuaiyun.com/pngynghay/article/details/22443525,本文给出的是AVL树的一种实现。采用非递归方式,效率较好,经过常规测试。 #include #include #include #include #include typedef enum{ EH = 0, LH = 1, RH = -1原创 2014-03-31 18:39:06 · 2327 阅读 · 0 评论 -
trie-字典树及实现
trie树又称为字典树、单词查找树。是一种树形结构,哈希树的变种。典型应用是用于统计、排序和保存大量的字符串(不仅仅限于字符串),经常被搜索引擎系统用于文本词频统计。trie树是用空间换取时间的典型数据结构。性质根节点不包含字符,除了根节点外,每个节点都只包含一个字符;从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;每个节点的所有子节点包含的字符都不相同。原创 2014-03-22 14:16:10 · 2329 阅读 · 0 评论 -
基本的内排序算法及其实现
假定被排序的数据是由一组记录组成的表,而每条记录都是有若干数据项组成,其中有一项可以用来标识整个记录,那么称该项为关键字项,该数据项的值就成为关键字。关键字可以用作排序运算的依据。所谓排序,就是要整理表中的记录,使之按关键字有序排列。当待排序记录的关键字均不相同时,排序的结果是唯一的,否则,排序结果不一定是唯一的。如果待排序的表中,存在有多个关键字相同的记录,经过排序后这些具有相同关键原创 2013-12-14 15:43:49 · 1606 阅读 · 0 评论 -
基本的字符串操作及其实现
本文主要实现基本的字符串操作,这些操作大部分都有C API,所以本文是在重复造轮子,但是,并不是无用功。这些重造的轮子增加了参数判断,可以让自己的代码更加健壮。需要包含的头文件#include #include #include 字符串长度int mystrlen(char *string){ int len = 0; assert(NULL != string原创 2013-12-11 17:20:01 · 1925 阅读 · 0 评论 -
字符串中的字符包含问题
假设有两个字符串contain,tobecontained,这两个字符串都是由字母和数字组成的,即构成这两个字符串的字符仅仅有a-z,A-Z,0-9这62个字符,当然,每个字符都可以出现若干次。下面的算法实现了这样一个功能:当tobecontained字符串中的每个字符都出现在contain字符串中时,返回1;如果tobecontained字符串中的任何一个字符在contain字符串中没有找到原创 2013-12-20 20:40:41 · 1238 阅读 · 0 评论 -
AVL树 VS 红黑树
平衡二叉树的追求的是全局均衡,如在做插入,删除操作时,需要调整整棵树,显然这是费时的,因此希望在做调整时,是局部调整,因此提出了红黑树,这样一种高效的数据结构(也是最变态的一种数据结构)。红黑树属于非严格意义上的平衡二叉树,说它不严格是因为它不是严格控制左、右子树高度或节点数之差小于等于1。但红黑树高度依然是平均log(n),且最坏情况高度不会超过2log(n),这有数学证明。所以它算平衡原创 2014-04-01 14:24:34 · 1904 阅读 · 0 评论 -
hash链表
hash链表概述hash链表是hash表和链表的结合,使用比较方便。hash链表实现本文的hash链表实现:hash头部用单链表、其他的hash节点用双向链表。实现主要取自Linux内核实现,本文做了移植。本文代码可从http://download.youkuaiyun.com/detail/it_pcode/6632905下载。hash实现#ifndef HLIST_H_#define原创 2014-03-23 19:29:32 · 2215 阅读 · 0 评论 -
双向链表
双向链表概述双向链表是一种基本的数据结构,有着广泛的应用。本博文实现了双向链表的创建、删除、遍历、替换、插入(从表头插入和从表尾插入)、元素的移动以及其他的一些链表基本操作(判断是否为空、链表拆分、链表的合并、获取第一个元素、获取下一个元素、获取上一个元素等等)。具体的代码实现可以从http://download.youkuaiyun.com/detail/it_pcode/6632905获取。为了便于学原创 2014-03-23 19:15:28 · 1226 阅读 · 0 评论 -
红黑树实现
红黑树概述红黑树是一种自平衡二叉查找树,典型的用途是实现关联数组。它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(logn)时间内做查找,插入和删除,这里的n是树中元素的数目。红黑树是 2-3-4树的一种等同。换句话说,对于每个 2-3-4 树,都存在至少一个数据元素是同样次序的红黑树。详细的红黑树介绍参考我转载的一篇博文http://blog.csdn.原创 2014-03-23 18:55:35 · 1641 阅读 · 0 评论 -
链表判环、判交问题
有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。1、如何判断一个链表是不是这类链表?2、如果链表为存在环,如果找到环的入口点?扩展:判断两个单链表是否相交,如果相交,给出相交的第一个点。 一、判断链表是否存在环,办法为:设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步转载 2012-11-09 21:06:52 · 811 阅读 · 0 评论 -
海量数据处理常用数据结构及方法
大数据时代,海量数据的分析也成为了各大公司面试的热点问题。本文总结了几种常用的方法。 bitmap 适用范围:可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下基本原理及要点:使用bit数组来表示某些元素是否存在;判重一般采用2-bitmap,即采用两个bit位来表示一个数据出现的次数(00表示未出现、01表示出现一次、10表示出现两次及其以上) 堆原创 2014-04-02 23:30:00 · 2163 阅读 · 0 评论 -
B树 VS B+树 VS R树
第一节、B树、B+树、B*树1.前言:动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树(Red-Black Tree ),B-tree/B+-tree/ B*-tree(B~Tree)。前三者是典型的二叉查找树结构,其查找的时间复杂度O(log2N)与树的深度相关,那么降低树的转载 2012-11-15 09:14:28 · 1801 阅读 · 0 评论 -
大根堆小根堆及其应用
堆的概念堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:Key[i]=Key[2i+1]&&key>=key[2i+2]即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为大顶堆,满足 Key[i]其中,大根堆和小根堆在海量数据的top N问题中,有着很好的时间复杂度原创 2014-03-25 12:49:14 · 11583 阅读 · 0 评论 -
堆的动态创建与根节点删除
堆的介绍与调整关于堆的介绍以及对于给定的完全二叉树,调整为大根堆或者小根堆,可以参考博文http://blog.youkuaiyun.com/pngynghay/article/details/22052737,在此不再赘述。本文主要是实现动态的创建一个堆,并且动态地向堆中插入元素,以及删除堆顶元素。堆的创建与删除操作分为大根堆与小根堆两种实现。头文件#include #include原创 2014-03-25 21:50:58 · 3220 阅读 · 0 评论 -
双堆求中位数及C实现
堆堆的动态创建与删除可参考http://blog.youkuaiyun.com/pngynghay/article/details/22101359,此处不再赘述。双堆求中位数算法描述:1、创建两个堆(一个小根堆、一个大根堆),堆大小至少为给定数据个数的一半,(size+1)/2,即向上取整;2、假定变量mid用来保存中位数,取定第一个元素,赋值给mid,即作为初始的中位数;3、依次遍原创 2014-03-26 20:54:17 · 2774 阅读 · 0 评论 -
Bloom Filter
Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。它是一个判断元素是否存在集合的快速的概率算法。Bloom Filter有可能会出现错误判断,但不会漏掉判断。也就是Bloom Filter判断元素不在集合,那肯定不在。如果判断元素存在集合中,有一定的概率判断错误。因此,Bloom Filter不适合那些“零错误原创 2014-03-26 22:08:17 · 1293 阅读 · 0 评论 -
AVL树及C语言实现
概念 平衡二叉树(Balanced binary tree)是由苏联数学家Adelson-Velskii and Landis于1962年首先提出的,所以又称为AVL树。定义:平衡二叉树或为空树,或满足如下性质的二叉树: (1)本身首先是一棵二叉搜索树 (2)左右子树深度之差的绝对值不超过1; (3)左右子树仍然为平衡二叉树.平衡因子BF=左子树深度-右子树深度.原创 2014-03-28 23:34:43 · 9707 阅读 · 2 评论 -
hash算法原理及常见函数
简介 散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法。顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙。散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数原创 2014-03-28 21:33:25 · 4394 阅读 · 1 评论 -
求子集
从网上搜集到了几个方法,整理如下: 方法一#include #define MAX_N 5int g_arr[MAX_N] = {0};__int64 g_cnt = 0;void Recur(int* arr, int arr_size, int req_cnt){ if (req_cnt > 0){ //数据没有选够,从剩下的数据中继续选 /原创 2012-11-09 20:58:55 · 644 阅读 · 0 评论 -
求数组中和为给定数所有的组合
一、问题描述给定一个数t,以及n个整数,在这n个数中找到加和为t的所有组合,例如t=4,n=6这6个数为[4,3,2,2,1,1],这样输出就有4个不同的组合它们的加和为4:4,3+1,2+2,and 2+1+1。请设计一个高效算法实现这个需求。二、解题思路先将数据按从大到小进行排序,然后使用回溯法遍历所有可能。注意去掉重复的结果。三、代码实现#includeusing n转载 2012-11-10 16:17:02 · 4095 阅读 · 0 评论 -
红黑树
红黑树红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是在1972年由鲁道夫·贝尔发明的,他称之为"对称二叉B树",它现代的名字是在 Leo J. Guibas 和 Robert Sedgewick 于1978年写的一篇论文中获得的。它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(logn)时间内做查找,插入和转载 2012-11-15 09:13:35 · 1174 阅读 · 0 评论 -
内存池及其实现
在本文,将用C语言实现不同类型的内存池,它们的原型分别来自于Linux内核的mempool、mysql的myalloc、nginx的ngalloc。原创 2013-11-28 16:18:44 · 2291 阅读 · 1 评论 -
复制带随机指针的链表
有一个链表List,其每个节点有2个指针,一个指针next指向链表的下个节点,另一个random随机指向链表中的任一个节点,可能是自己或者为空,写一个程序,要求复制这个链表的结构并分析其复杂性。List如图一图一:需要复制的链表图二:ABCD是原来的链表,A’B’C’D’是复制的链表,第一遍扫描顺序复制next指针,把ABCD的next分别指向A’B’C’D’,将A’的原创 2012-11-09 21:11:41 · 831 阅读 · 0 评论 -
双层桶
双层桶双层桶不是数据结构,只是一种算法思维,分治是其根本思想。在处理海量数据时,有着一席之地。当我们有一大堆数据需要处理,而局限于各种资源限制(内存、范围等)又不能一次处理完毕,此时,我们就需要将这一大堆数据分成我们可以处理的多个小段数据。然后,按照一定的策略处理各小段数据,从而完成既定目标。双层桶并不是要求我们只能把我们的大数据划分一次,双层是个虚指,如果有需要,可以把数据一层一层的原创 2014-03-26 23:34:11 · 2248 阅读 · 0 评论 -
洗牌算法分析总结
先定义出一个基本概念:究竟洗牌算法的本质是什么?也就是说,什么样的洗牌结果是“正确”的?一个比较确切的定义,在经过洗牌函数后,如果能够保证每一个数据出现在所有位置的概率是相等的,那么这种算法是符合要求的。在这个前提下,尽量降低时间复杂度和空间复杂度就能得到好的算法。第一个算法:随机抽出一张牌,检查这张牌是否被抽取过,如果已经被抽取过,则重新抽取,直到找到没被抽出过的牌,然后把这张牌放入原创 2014-04-12 14:10:22 · 1553 阅读 · 3 评论 -
C语言实现全排列
全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个;为了用递归的方式实现全排列,我们将整组数中的所有的数分别与第一个数交换,然后总是处理后n-1个数的全排列。 #include int count = 0;void swap(int *a, int *b){ int tmp = 0; tmp = *a; *a = *b;原创 2014-04-10 18:44:57 · 1583 阅读 · 0 评论