数据结构与算法
哈维先生
这个作者很懒,什么都没留下…
展开
-
归并排序(MergeSort)
dd原创 2013-08-22 18:24:54 · 575 阅读 · 0 评论 -
合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。链表结点定义如下:struct ListNode{ int m_nValue; ListNode * m_pNext;}代码如下:ListNode * Merge(ListNode * head1, ListNode *head2){ if(head1==NULL原创 2014-01-13 21:31:38 · 738 阅读 · 0 评论 -
字符串的排列
题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bca、bac、cab、cba。解析:指针pStr指向整个字符串的第一个字符,pBegin指向当前做排列操作的字符串的一个字符,在每一个递归的时候,我们从pBegin向后扫描每一个字符,在交换pBegin和pCh指向的字符之后,再对pBegin后面原创 2014-01-13 22:09:13 · 649 阅读 · 0 评论 -
二叉树的深度
题目:输入一颗二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点形成树的一条路径,最长路径的长度为树的高度。代码如下:int BinaryTreeDepth(ListNode * head){ if(head == NULL) { return 0; } int left = BinaryTree原创 2014-01-13 22:18:42 · 690 阅读 · 0 评论 -
一个链表问题:复制带随机指针的链表
题目:有一个链表L,其每个节点有2个指针,一个指针next指向链表的下个节点,另一个random随机指向链表中的任一个节点,可能是自己或者为空,写一个程序,要求复制这个链表的结构并分析其复杂性 解决方法一:O(n)的复杂度,扫面两边即可。转载 2014-01-17 00:02:02 · 1091 阅读 · 0 评论 -
哈希表的实现
哈希表的几个概念:映像:由哈希函数得到的哈希表是一个映像。冲突:如果两个关键字的哈希函数值相等,这种现象称为冲突。建立哈希表是为了消除通过遍历比较来搜索键带来的时间浪费。如果想在一个表中直接地找到记录,记录的存储位置和它的关键字之间建立一个确定的对应关系f(),使每个关键字和结构中一个唯一的存储位置相对应。这便是哈希表的快速查找原理。哈希表的构造方法(即寻找键和原创 2014-03-09 10:29:10 · 1022 阅读 · 0 评论 -
最长公共子串
方法一.原创 2014-03-17 11:17:55 · 103 阅读 · 0 评论 -
对n个整数进行排序,时间复杂度为o(n),空间复杂度为o(1)
假定你的数字范围在0到65535范围之内,定义一个数组count[65536](这个空间是常量,和n无关,所以是O(1) ),初值全部为0。那么假设有下面这些数字:10020030011906...那么对于每个这个数字,都做在count中记录一下:100 => count[100]++200 => count[200]++300 => count[3原创 2014-03-17 15:54:12 · 2255 阅读 · 0 评论 -
二叉树的序列化
1. 保存这棵二叉树的先序和中序遍历,这样就可以重构出来了; 2. 保存二叉树的先序遍历并且包括所有的NULL,这样也可以重构出来; 3. 把这棵树填满成完全二叉树,不存在的结点用特殊的值表示,按层序列化,每层从左到右,重构的时候忽略不存在的结点; 4. 类似于方法2,把每一个结点同它在完全二叉树中的序号一同保存(按层排序,每层 从左到右排序),一样可以重构出来。原创 2014-03-21 15:18:42 · 438 阅读 · 0 评论 -
从上往下打印二叉树
题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。二叉树结点的定义如下:代码如下:void PrintBinaryTree(Node* head){ Queue qu; qu.push(head); while(!qu.empty()) { Node* temp = qu.top();原创 2014-01-13 22:51:57 · 720 阅读 · 0 评论 -
链表反转
Node * reverse(Node * head){ Node * now = head; Node * pre = NULL; Node * ne = NULL; while( now != NULL ) { ne = now ->next; if(ne == NULL) {原创 2014-01-09 23:07:00 · 742 阅读 · 0 评论 -
冒泡排序(BubbleSort)
算法描述冒泡排序是基本思想通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另外一部分的关键字小,则可分别对这部分记录继续进行排序,直至整个序列有序为止。实现步骤比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的原创 2013-08-21 23:38:32 · 770 阅读 · 0 评论 -
堆排序(Heap Sort)
算法描述快速排序(Quick Sort)属于冒泡排序的一种变形。快速排序是一种不稳定性的排序。基本思想通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另外一部分的关键字小,则可分别对这部分记录继续进行排序,直至整个序列有序为止。实现步骤最左边的元素作为参照数据;小于参照数据的集合作为左边的子集合,大于参照数据的集合作为右边的子集合分别原创 2013-08-22 17:39:28 · 115 阅读 · 0 评论 -
堆排序(HeapSort)
算法描述堆排序(HeapSort)不是一个稳定的排序。它是使用完全二叉树的数据结构进行排序的算法。基本思想若在输出堆顶得最小值之后,使得剩余的n-1个元素的序列重又建成一个堆,则得到n哥元素中的次小值,如此反复执行,便能得到一个有序序列,这个过程称之为堆排序。实现步骤将原始序列调整为最小或者最大堆序列,从而建立初始堆;将堆顶元素与序列的最后一个元素进行交原创 2013-08-23 09:39:39 · 607 阅读 · 0 评论 -
插入排序(InsertionSort)
算法描述插入排序是在一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序。基本思想插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入原创 2013-08-24 16:16:09 · 661 阅读 · 0 评论 -
选择排序(SelectionSort)
算法描述选择排序是一种不稳定排序。基本思想每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。实现步骤从序列中找到最小的元素,并与第一个元素交换;从a[2],...a[n]中的元素中找到最小的元素,并与a[2]交换,从而a[1],a[2]是有序的;以此类推,从a[i],...,a[n]中的元素中原创 2013-08-24 16:48:43 · 707 阅读 · 0 评论 -
二分查找(BinarySearch)
代码实现代码已经在xcode中验证,可以直接使用。//二分查找int BinarySearch(int a[],int length, int value){ int first = 0; int last =length - 1; //循环进行的条件 while(first <= last) { //得到数组的中间元素原创 2013-08-24 18:41:36 · 775 阅读 · 0 评论 -
2.5亿个整数中找出不重复的整数
问题描述:在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数。思路:采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,共需内存2^32 * 2 bit=1 GB内存,还可以接受。然后扫描这2.5亿个整数,查看Bitmap中相对应位,如果是00变01,01变10,10保持不变。扫描后,查看bitmap,原创 2014-01-03 10:45:38 · 2973 阅读 · 1 评论 -
Double Array Trie
Trie结构是模式匹配中经常用到的经典结构,在字符串处理中发挥着重要的作用,比如分词算法,就会利用Trie结构将分句的已知词条先识别出来,然后再判断剩下的未识别部分是否是新的未知词。经典的Trie结构如下图所示,是一个典型的多叉树结构,为了保证用Trie结构进行模式匹配的效率,Trie结构的每一个节点往往会容纳输入字符集的所有字母构成的数组,以便实现高速查找,这样的缺点原创 2015-02-11 14:13:48 · 340 阅读 · 0 评论