数据结构与算法
文章平均质量分 68
tkp2014
这个作者很懒,什么都没留下…
展开
-
字符串全排列问题二
已经是求职过程中第三次碰到这个问题了,笔试两次,又面了一次,觉得这个问题确实值得深思啊。我还是尽量总结下吧,说不定以后还会碰到。问题:已知输入为一个字符串,求其全排列的输出。比如输入为abc,那么输出有以下几种:abcacbbacbcacabcba即如果输入字符串的长度为N的话,会输出N!个结果。方法一:递归思路是这样的:我们维护两个序列,一个序列是要进行全转载 2015-11-02 17:01:10 · 971 阅读 · 0 评论 -
将两个有序单链表合并
假设有两个单链表,头结点分别为 list1, list2, 如果 list1为空,直接返回 list2,如果list2为空,直接返回 list1,如果两个链表均存在,那么这两个链表进行逐个元素的比较,如果list1中的元素大于 list2的,将list2的值保存到合并链表中,否则,将list1中的值保存到合并链表中去,如果任何一个链表遍历结束,将另外一个链表的余下部分保存到合并链表中去原创 2015-07-31 21:43:21 · 972 阅读 · 0 评论 -
最少找零
int moneySort[] = {25,10,5,1};int g_num25;int g_num10;int g_num5;int g_num1;int g_moneyLeft = 0;int g_currMoney = 0;void searchLoop(int totalCheck, int money, int &num){ while (1)//找零需要的最大数原创 2015-08-01 22:18:30 · 429 阅读 · 0 评论 -
双向冒泡排序
void Bubble2Sort(int array[], int length){ int left = 1; int right = length-1; int t; do { //正向部分,每次得到一个最小值 for (int i=right; i>=left; --i) { if (array[i]<array[i-1]) { Swap(arr原创 2015-08-01 15:18:32 · 374 阅读 · 0 评论 -
插入排序
* 直接插入排序 */void InsertSort(int *a, int len){ int i,j; int temp; for (i=1; i<len; ++i)//每次表示待插入的元素 { temp = a[i]; for (j=i-1; j>=0; --j) //表示前面已排列有序的数据 { if (a[j]>temp) { a[j+1] =原创 2015-08-01 14:50:23 · 281 阅读 · 0 评论 -
有序单链表合并(递归法)
只是提供思路,缺少很多边界条件的检查/* 递归法实现有序单链表的合并 */LinkedList *MergeRecursive(LinkedList *head1, LinkedList *head2){ if (head1 == NULL) return head2; if (head2 == NULL) return head1; LinkedList *head =原创 2015-07-31 21:51:51 · 496 阅读 · 0 评论 -
判断链表是否有环及两个链表是否交叉
单向链表是最常用的数据结构之一,因此总结其常见的问题及其解决方案是很有意义的。 问题1:如何判断一个单向链表是否有环?如果有,如何找到其入口节点的指针? 算法思想:用两个指针p1,p2同时指向链表的头部,p1一次移动一步,p2一次移动两步,如果最终p1和p2重合则说明链表有环,如果p2走到空指针(链表的结尾)则说明链表无环; 如果最终p1转载 2015-07-31 20:12:14 · 581 阅读 · 0 评论 -
单链表删除重复节点
/* 删除链表中的重复节点 *///递归法求解LinkedList *delSame(LinkedList *head){ pLinkedList pointer,temp=head; if (head->next == NULL) //只有头结点,链表为空 { return head; } head->next = delSame(head->next); pointer原创 2015-07-30 23:15:41 · 654 阅读 · 0 评论 -
如何实现单链表任意两个元素交换(不包括表头)
// 凭第一感觉写的版本,算法和思路有好的想法再优化/* 交换链表任意两个元素 */void SwapItem(LinkedList *head, int posA, int posB)//从非头结点开始交换操作{ //保证至少存在两个节点 assert(head && head->next && head->next->next); assert(posA>=1 &&原创 2015-07-30 20:40:40 · 1061 阅读 · 0 评论 -
求有环单链表中的环长、环起点、链表长
求有环单链表中的环长、环起点、链表长1.判断单链表是否有环 使用两个slow, fast指针从头开始扫描链表。指针slow 每次走1步,指针fast每次走2步。如果存在环,则指针slow、fast会相遇;如果不存在环,指针fast遇到NULL退出。 就是所谓的追击相遇问题: 2.求有环单链表的环长 在环上相遇后,记录第一次相遇点为Pos,之后指针slo转载 2015-07-29 20:18:39 · 327 阅读 · 0 评论 -
归并排序
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。[cpp] view plaincopy//将有序数组a[]和b[转载 2015-07-29 20:04:25 · 329 阅读 · 0 评论 -
单链表排序
/* 链表冒泡排序 */void BubbleSortList(Node *p){ assert(p && p->next); //至少有一个节点 Node *_temp = p->next; Node *_node = p->next; int temp; for (; _temp->next; _temp = _temp->next) { for (_node=p->ne原创 2015-07-29 13:45:01 · 343 阅读 · 0 评论 -
单链表反转
* 单链表反转另外一种写法 */LinkedList *ListReverse(LinkedList *L){ LinkedList *current, *pNext; if (L == NULL) return NULL; //链表不存在,这里L指的是头结点 if (L->next == NULL) return L; current = L->next; while (curr原创 2015-07-28 21:49:38 · 306 阅读 · 0 评论 -
如何找出单链表中的倒数第K个元素
/* 找出单链表中倒数第K个数 *//* 查找过程中,设置两个指针,让其中一个指针比另一个指针先前移动 K-1 步 ,然后两个指针同时移动,循环直到先行指针为NULL */templatestruct LinkedList{ T data; LinkedList *next;};templateLinkedList* FindElem(LinkedList* head, int原创 2015-07-28 19:30:23 · 502 阅读 · 0 评论 -
链表中的头指针和头节点
线性表使用顺序(数组)存储时有个弊端,那就是在插入和删除时需要大量的移动数据,这显示是非常消耗时间的,所以可以采用链式存储,即有一个指针域(单链表),来记录下个结点的存储位置(地址),这样在插入和删除结点时只需要修改指针域即可,从而大量减少移动数据所消耗的时间。来看链表的定义:struct node { int data; struct node *next;};其中有两个元素转载 2015-07-28 21:16:22 · 557 阅读 · 0 评论 -
单链表操作
单链表反转和逆序:http://www.nowamagic.net/librarys/veda/detail/2241原创 2015-07-28 21:08:02 · 309 阅读 · 0 评论 -
如何计算两个有序整型数组的交集
/* 二路归并查找数组交集 */int mixed(int array1[], int n1, int array2[], int n2, int* mixed){ int i=0, j=0, k=0; while (i<n1 && j<n2) //有一个数组遍历结束,此次查询结束 { if (array1[i]==array2[j]) { mixed[k++] = arr原创 2015-07-27 14:28:01 · 560 阅读 · 0 评论 -
0-1背包问题
01背包问题,是用来介绍动态规划算法最经典的例子,网上关于01背包问题的讲解也很多,我写这篇文章力争做到用最简单的方式,最少的公式把01背包问题讲解透彻。01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ), f[i-1,j] }f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值。Pi转载 2015-08-01 22:15:45 · 311 阅读 · 0 评论 -
不带头结点的头插法和尾插法
可见:不带头指针的插入操作比较繁琐,尤其是尾插法,每次需要遍历链表找到尾节点,然后执行插入操作typedef int DATA;struct SNode{ DATA data; SNode *pNext;};SNode *g_pHead = NULL;/* 不带头结点的尾插法和头插法 */void AddHead(DATA d){ SNode *p = (SNode原创 2015-08-16 16:55:08 · 13237 阅读 · 0 评论 -
字符串全排列问题一
问题:输入一字符串(要求不存在重复字符),打印出该字符串中字符中字符的所有排列。例如:输入"abc",输出结果为abc, acb, bac, bca, cab和cba。方法一:比较笨,用一个整型数组,记录当前排列的下标,然后输出下标对应的字符串,空间代价为O(n) 代码:[cpp] view plaincopyprint?转载 2015-11-02 16:42:10 · 414 阅读 · 0 评论 -
堆排序问题
http://www.cnblogs.com/dolphin0520/archive/2011/10/06/2199741.htmlhttp://blog.csdn.net/morewindows/article/details/6709644/转载 2015-11-02 23:44:26 · 404 阅读 · 0 评论 -
单链表排序
单链表排序是单链表的常见编程任务之一,也是面试中经常出现的题目。单链表排序的关键是交换算法,需要额外考虑。选择排序是比较直观的排序算法之一,这里就使用选择排序实现单链表的排序。如果需要对选择排序复习一下,传送门:算法导论:选择排序的原理与实现。第一种方法:LinkList SelectSort2(LinkList L){ LinkList p,q,small;转载 2015-10-29 17:53:08 · 479 阅读 · 0 评论 -
寄存器某一位置位或者清零
应用一:将寄存器中的某一位置1或则清0,保持其他位不变。int l_data;void SetBit(int pos)//将某一位置位的操作{ if((pos >= 0) && (pos <= 31)) { l_data |= BIT_MASK(pos);//BIT_MASK是 掩码。就是除了这一位其余位均为0 }}void ClrBit(int pos)//将转载 2015-10-29 19:24:39 · 15984 阅读 · 0 评论 -
第一个只出现一次的字符
不使用hashmap的方法,直接,效率不高//找到字符数组中第一个只出现一次字符的位置int FirstNotRepeatingChar(string str) { if (str=="") return -1; int Cstr[52] = {0};//统计可能出现的字母的次数:a-z,A-Z for (int i=0; i<str.size(); i++)//统计原创 2015-10-27 00:02:32 · 283 阅读 · 0 评论 -
KMP算法总结
多种字符串匹配算法比较字符串匹配的KMP算法详解KMP算法KMP算法的Next数组原创 2015-10-24 00:16:15 · 660 阅读 · 0 评论 -
树以及树的遍历和搜索
1. 数据结构定义树是由一系列节点和节点之间的关系组成,递归定义描述如下:若节点集合为空集,可以是一棵树;若节点集合非空,则由树根(root)以及零个或多个非空的子树(T1,T2...Tk)组成,root与其每棵子树的树根之间有一条边关联;树的一个节点中除了存储本身包含的数据外,还要存储该节点的孩子节点、兄弟节点之间的关系,通常用的存储结构如下:转载 2015-11-06 19:29:57 · 513 阅读 · 0 评论 -
在无序集合的递归二分查找
使用递归实现对一个无序集合元素的二分查找,假设已经有一个排序函数,供你直接使用,所以你不需要自己实现一个排序函数,保证代码可读性、易于维护、有一定的健壮性。bool g_iUsort = true;int comp(const void* a, const void* b){ return *(int*)a - *(int*)b;}bool getBise原创 2015-11-06 12:04:50 · 677 阅读 · 0 评论 -
寻找一个数组中的鞍点
//如果一个数是一行中的最小值,同时又是一列中的最大值,//则我们称这个数为一个二维数组的鞍点,那么现在输入一个二维数组,请你找出这个数组的鞍点#define ROW 4#define COLUMN 5void getAnPoint(int a[][COLUMN]){ if (a==NULL) return; for (int i=0; i<ROW; i++) { in原创 2015-11-06 19:17:24 · 1624 阅读 · 0 评论 -
求一个集合的子集
转载请注明出处http://blog.csdn.net/pony_maggie/article/details/31042651作者:小马一个包含n个元素的集合,求它的所有子集。比如集合A= {1,2,3}, 它的所有子集是:{ {1}, {2}, {3}, {1,2}, {1,3}, {2,3}, {1,2,3}, @}(@表示空集转载 2015-11-05 17:05:08 · 835 阅读 · 0 评论 -
10G数据量,只有2G内存,怎样找到中位数?
链接:http://blog.sina.com.cn/s/blog_62714d6a0100m96m.html文件中有10G个整数,乱序排列,要求找出中位数 (2010-09-25 18:15:03)转载▼标签: 杂谈分类: 算法 题目:在一个文件中有 10G 个整数,乱序排列,转载 2015-10-18 23:06:40 · 7290 阅读 · 1 评论 -
大数相乘问题
算法题-大数相乘问题今天在网上看到一个大数相乘的问题,题目是这样的:输入两个整数,要求输出这两个数的乘积。输入的数字可能超过计算机内整形数据的存储范围。分析:由于数字无法用一个整形变量存储,很自然的想到用字符串来表示一串数字。然后按照乘法的运算规则,用一个乘数的每一位乘以另一个乘数,然后将所有中间结果按正确位置相加得到最终结果。可以分析得出如果乘数为A和B,A的位数为m,B的位转载 2015-09-13 17:10:48 · 351 阅读 · 0 评论 -
变位词问题
问题C 给定一个英语词典,找出其中的所有变位词的集合。例如,“pots”、“stop”和“tops”互为变位词,因为每一个单词都可以通过改变其他单词中的字母的顺序来得到。解答: 最容易想到解决方法就是:对于每一个单词,找出其的所有排列,然后对词典进行遍历,如果其排序在词典中,那么此排序序列就是该词典中此单词的变位词。 但是这种方法对于单词长度不是很长,且词典不是很转载 2015-10-16 17:54:30 · 528 阅读 · 0 评论 -
二叉树先序遍历的理解
二叉树的结点结构是: 1、根结点(存放结点数据) 2、左子树指针 3、右子树指计 对二叉树的遍历就是访问各个结点中根结点里存放的数据。例如: 如果结点A有左结点B,右结点C,记作A(B,C),不同结点我用"\"隔开。那么有这样一个(BitTree)二叉树表A(B,C) \B(D,E)\E(F.G)\C(空,H)\H(I.空), 自己画出来,不然我后面白讲转载 2015-09-05 16:02:43 · 558 阅读 · 0 评论 -
二叉树的性质总结
性质1:在二叉树的第i层至多有个结点性质2:深度为K的二叉树的最大节点数为(k>=1) 性质3:对于任何终端结点 ,度为2的节点数为 ,则 = + 1完全二叉树的两个重要特性:性质1:具有n个节点的完全二叉树的深度为 + 1性质2:对于有n个节点的完全二叉树(其深度为 +1)的结点按层序号(从第一层到第+1层,每层从左往右),则对任一结点原创 2015-09-04 22:48:23 · 343 阅读 · 0 评论 -
快速排序
实现思路一:int Partition(int data[], int length, int start, int end){ if (data==NULL || length=length) throw new exception("Invalid Parameters!"); int index = start + rand()%(end-start+1); Myswap原创 2015-09-08 20:18:25 · 263 阅读 · 0 评论 -
二分查找法的递归和非递归实现
/* 非递归法实现二分查找 *///实现一个查找关键字在数组中的位置,并返回下标,如果不存在,返回-1int getPosition(int *arr, int len, int key) //len:数组长度,key:待查找的关键字{ int first=0, last=len-1; while (1) { if (first<last) { if (key原创 2015-07-26 23:55:57 · 466 阅读 · 0 评论 -
如何在排序数组中,找出给定数字出现的次数
如何在排序数组中,找出给定数字出现的次数 ? 例如,数组 [1, 2, 2, 2, 3]中2的出现次数为 3/* 如何在排序数组中,找出给定数字出现的次数 */int findItemInorderArray(int *arr, int key, int start, int end){ assert(arr); assert(start>=0 && end>=0);原创 2015-07-27 09:55:58 · 1215 阅读 · 0 评论 -
找出数组中重复次数最多的数
/* 使用Map映射表 */bool findMostFrequentInArray(int *a, int size, int &val){ assert(a); if (size == 0) return false; map m; for (int i=0; i<size; ++i) { if (++m[a[i]] >= m[val]) val = a[i]; }原创 2015-07-27 15:28:18 · 796 阅读 · 0 评论 -
KMP算法
1.首先,字符串”BBC ABCDAB ABCDABCDABDE”的第一个字符与搜索词”ABCDABD”的第一个字符,进行比较。因为B与A不匹配,所以搜索词后移一位。2.因为B与A不匹配,搜索词再往后移。3.就这样,直到字符串有一个字符,与搜索词的第一个字符相同为止。4.接着比较字符串和搜索词的下一个字符,还是转载 2015-03-28 17:28:27 · 367 阅读 · 0 评论 -
算法积累
Baum-Welch algorithmTwo-level schedulingViterbi algorithmhmm-recombinationHidden Markov model搜索算法:A*beam search two-level原创 2015-03-25 09:55:56 · 402 阅读 · 0 评论