算法分析
文章平均质量分 72
miao6664659
这个作者很懒,什么都没留下…
展开
-
单链表2
单链表的算法:给定一个单链表,它可能是一个以NULL结尾的非循环链表,也可能是一个循环结构的循环链表。已知这个链表的头指针,请编写一个函数来判断该链表属于哪类情况,该函数不得对链表本身做任何修改。 用两个指针同时遍历检查,快指针+满指针;当快指针超过满指针就是一个循环链表。让快慢两个指针从链表的头元素开始遍历,无限循环 如果快指针遇到了NULL指针原创 2012-02-22 19:05:48 · 722 阅读 · 0 评论 -
单链表算法(1)
单链表的算法:1:给定一个单向链表,设计一个既省空间又省时间的算法来找出该链表中倒数第m个元素。倒数第m个元素,是这样规定的:当m=1时候,链表的最后一个元素将被返回。 方案一:对链表两次遍历,第一次确定链表的长度,第二次确定倒数第m个元素。 方案二:对链表进行一次遍历,引入了两个指针,中间间隔是m个元素。 // 查找一单链表中倒数第m个元素。#includ原创 2012-02-22 18:08:49 · 780 阅读 · 0 评论 -
单链表 算法(删除中间节点)
单链表的算法:假设有一个没有头指针的单链表,一个指针指向此单链表中间的一个节点(不是第一个,也不是最后一个),如何将该节点从单链表中删除。 void DeleteRandomNode(LinkList& pCurrent){ //Cant Delete the Last One. assert (pCurrent!=NULL); LinkList pNext=pC原创 2012-02-23 10:18:09 · 1187 阅读 · 0 评论 -
单链表三(判断一单链表是不是循环单链表)
单链表的算法:给定一个单链表,它可能是一个以NULL结尾的非循环链表,也可能是一个循环结构的循环链表。已知这个链表的头指针,请编写一个函数来判断该链表属于哪类情况,该函数不得对链表本身做任何修改。 用两个指针同时遍历检查,快指针+满指针;当快指针超过满指针就是一个循环链表。让快慢两个指针从链表的头元素开始遍历,无限循环 如果快指针遇到了NULL指针翻译 2012-02-23 10:04:33 · 956 阅读 · 0 评论 -
单链表的原地逆转 (只遍历一次)
单链表 (扩展问题):给定一个链表的头指针,要求只遍历一次,将单链表中的元素的顺序翻转过来。//头插法,额外增加三个指针。void ReverseLinkList(LinkList& Head){ LinkList p,r,temp; p=Head->Next; temp=p; r=p->Next; whi原创 2012-02-23 10:37:23 · 3532 阅读 · 0 评论 -
贪心算法 安排活动的问题 最大限度的利用有限资源
设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si 下面给出贪心算法的程序框架:Greedy(C)//C是问题的输入集合,及候选集合{ S={};//初始解集合为空 While(not solution(s))//集合原创 2012-03-31 19:26:33 · 1499 阅读 · 0 评论 -
二叉树中两个节点的最近公共父节点 使用二叉排序树
以下是我的算法之后是Hackbuteer1的算法 Hack的算法更加好。 BiTree al=NULL,ar=NULL;BiTree FindAnstorBST(BiTree T,BiTree a,BiTree b){ if(T) { if(T->value>a->value && T->valuevalue) return T; if(T->valuevalue &转载 2012-10-30 10:18:06 · 814 阅读 · 0 评论 -
使用分治法求解数组的第k大数
http://blog.csdn.net/hackbuteer1/article/details/6651804首先,需要在一个数组中,随机抽出一个元素,然后比这个元素大的放到他的右边,比这个元素小的放在它的左边:void pailie(int* &p,int len){ time_t t; srand((unsigned) time(&t)); int index=ran转载 2012-10-30 10:58:14 · 2992 阅读 · 0 评论 -
经典的面试题:链表的相交与环问题 (一)
1、 给出两个单向链表的头指针pHead1和pHead2,判断这两个链表是否相交。假设两个链表均不带环。示意图如下: 如果两个链表相交于某一节点,那么在这个相交节点之后的所有节点都是两个链表所共有的。也就是说,如果两个链表相交,那么最后一个节点肯定是共有的。先遍历第一个链表,记住最后一个节点,然后遍历第二个链表,到最后一个节点时和第一个链表的最后一个节点做比较,如果相同,则相交,否转载 2012-10-31 15:44:44 · 820 阅读 · 0 评论 -
链表的相邻元素的翻转
http://blog.csdn.net/hackbuteer1/article/details/65961221、清空链表跟销毁链表的区别链表本身是一个数据结构,清空是把链表中的元素清空,但链表还存在,销毁则是把链表这个结构的内存都释放了。。清空是链表没节点,但是链表还在,可以继续插入节点。销毁就是链表没了,整个链表的空间都被释放了,不能进行任何操作了。就像一个杯子,把杯子里的水转载 2012-10-31 20:32:33 · 1181 阅读 · 0 评论 -
判断单链表是否有环 并找出第一个相交的节点
http://blog.csdn.net/hackbuteer1/article/details/75831022、给出一个单向链表的头指针pHead,判断链表中是否有环。示意图如下:链表中有环,其实也就是自相交。我们用两个指针pslow和pfast从头开始遍历链表,pslow每次前进一个节点,pfast每次前进两个结点,若存在环,则pslow和pfast肯定会在环中相遇,若不存在转载 2012-11-01 09:55:06 · 2285 阅读 · 0 评论 -
从长度为n的数组中(元素互不相同)任意选择m个数的所有组合
DFS http://blog.csdn.net/hackbuteer1/article/details/8035261/** ** author :hackbuteer** date :2012-10-01 **/#include#includeusing namespace std;int arr[] = {1,2,3,4,5,6,7,8,9,10};int转载 2012-10-28 17:08:55 · 4228 阅读 · 0 评论 -
白话经典算法系列之五 归并排序的实现
http://blog.csdn.net/morewindows/article/details/6678165归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列转载 2012-11-02 14:43:10 · 509 阅读 · 0 评论 -
使用VC库函数中的快速排序函数
上一篇讲了快速排序的实现。但在很多场合,直接使用快速排序的库函数是很方便的。下面讲下VC中库函数qsort()的用法:http://blog.csdn.net/morewindows/article/details/6684561函数原型:void qsort(void *base,size_t num,size_t width, int (__cdecl *compare )(const转载 2012-11-02 20:22:40 · 545 阅读 · 0 评论 -
如何在C/C++中动态分配二维数组
转自:http://blog.csdn.net/morewindows/article/details/7664479如何在C/C++中动态分配二维数组在C/C++中动态分配二维数组可以先申请一维的指针数组,然后该数组中的每个指针再申请数组,这样就相当于二维数组了,但是这种方法会导致每行可能不相邻,从而访问效率比较低。 int **p=(int**)malloc(size转载 2012-11-02 21:13:53 · 797 阅读 · 0 评论 -
白话经典算法系列之一 冒泡排序的三种方案
http://blog.csdn.net/morewindows/article/details/6657829冒泡排序是非常容易理解和实现,,以从小到大排序举例:设数组长度为N。1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。3.N=N-1,如果N不为转载 2012-11-02 19:53:44 · 553 阅读 · 0 评论 -
白话经典算法系列之二 直接插入排序的三种实现
http://blog.csdn.net/morewindows/article/details/6665714直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。设数组为a[0…n-1]。1. 初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=转载 2012-11-05 09:10:54 · 504 阅读 · 0 评论 -
白话经典算法系列之三 希尔排序的实现
http://blog.csdn.net/morewindows/article/details/6668714希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够转载 2012-11-05 09:30:44 · 515 阅读 · 0 评论 -
Kruscal算法 并查集求解最小生成树
http://blog.csdn.net/hackbuteer1/article/details/7265681http://ac.jobdu.com/problem.php?id=1347 孤岛连通工程刚开始的时候使用qsort排序函数进行排序提交一直都是TLE,后来无意中改为sort排序函数提交就AC了,真是太神奇了。。。#include#includeusing nam转载 2012-11-05 19:24:55 · 510 阅读 · 0 评论 -
字符串的全排列和组合算法
http://blog.csdn.net/hackbuteer1/article/details/7462447全排列在笔试面试中很热门,因为它难度适中,既可以考察递归实现,又能进一步考察非递归的实现,便于区分出考生的水平。所以在百度和迅雷的校园招聘以及程序员和软件设计师的考试中都考到了,因此本文对全排列作下总结帮助大家更好的学习和理解。对本文有任何补充之处,欢迎大家指出。首先来看看题目是转载 2012-11-05 20:38:57 · 485 阅读 · 0 评论 -
白话经典算法系列之六 快速排序
http://blog.csdn.net/morewindows/article/details/6684558快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。总的说来,要转载 2012-11-05 22:13:52 · 604 阅读 · 0 评论 -
STL系列之四 heap堆
http://blog.csdn.net/morewindows/article/details/6967409下面再介绍STL中与堆相关的4个函数——建立堆make_heap(),在堆中添加数据push_heap(),在堆中删除数据pop_heap()和堆排序sort_heap():头文件 #include 下面的_First与_Last为可以随机访问的迭代器(指针),_Comp为比转载 2012-11-06 10:18:50 · 562 阅读 · 0 评论 -
二叉排序树的创建和遍历与删除指定的节点
二叉排序树(Binary Sort Tree)又称二叉查找树。 它或者是一棵空树;或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树;二叉排序树性能分析每个结点的C(i)为该结点的层次数。最坏情况下,当先后插入的关键字有序时,构成的二叉排转载 2012-10-29 09:34:13 · 1126 阅读 · 0 评论 -
将字符串转化为大写或者是小写 北航的题目
题目描述: 读入数据string[ ],然后读入一个短字符串。要求查找string[ ]中和短字符串的所有匹配,输出行号、匹配字符串。匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配。如“aa[123]bb”,就是说aa1bb、aa2bb、aa3bb都算匹配。输入:输入有多组数据。每组数据第一行输入n(1输出:输出匹配到的字符串的行号和该字符串(匹配时不区转载 2012-10-29 20:04:58 · 661 阅读 · 0 评论 -
从m个数中任意去n个数的组合
总共有m个数字,从m个数字中找出n个数字的组合。 int b[100];int m=10;//总共10个数字 0,1,2,3,4,5,6,7,8,9int n=4;//选择4个数字 //从m中选取n个数 i表示当前选择的个数 i==n时候输出 k表示从第k个数字开始void com(int i,int k){ if(i<n) { for(int j=k;j<=m-n+i;转载 2012-11-01 20:44:25 · 2071 阅读 · 0 评论 -
erase的使用
template inline _OutputIter copy(_InputIter __first, _InputIter __last, _OutputIter __result) { __STL_REQUIRES(_InputIter, _InputIterator); __STL_REQUIRES(_OutputIter, _Ou转载 2012-10-26 15:17:36 · 684 阅读 · 0 评论 -
STL系列之五 priority_queue 优先队列
http://blog.csdn.net/morewindows/article/details/6976468priority_queue 优先级队列是一个拥有权值概念的单向队列queue,在这个队列中,所有元素是按优先级排列的(也可以认为queue是个按进入队列的先后做为优先级的优先级队列——先进入队列的元素优先权要高于后进入队列的元素)。在计算机操作系统中,优先级队列的使用是相当频繁的,转载 2012-11-07 09:09:55 · 529 阅读 · 0 评论 -
秒杀多线程第二篇 多线程第一次亲密接触 CreateThread 与 _beginthreadex本质区别
http://blog.csdn.net/morewindows/article/details/7421759本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beginthreadex到底有什么区别,在实际的编程中到底应该使用CreateThrea转载 2012-11-06 15:31:58 · 553 阅读 · 0 评论 -
STL容器中放入wchar_t*指针出错 Vector中放入wchar_t*
STL疑问#include class DistDrivers{public: virtual void GetLogicalDriveStrings()=0;public: int m_LogicalNum;//系统中逻辑驱动器的个数 std::vector m_LogicalNames;//系统中所有的驱动器字符串的信息 int m_DriveType;//驱动器类型 fl转载 2012-10-31 11:10:20 · 2161 阅读 · 0 评论 -
已知二叉树先序和中序序列 求后序序列
源码如下:void test(std::string str1,std::string str2,int length){ if(str1.empty()&&str2.empty()) return; s.push(str1.c_str()[0]); int count=str2.find_first_of(s.top()); std::string str11,str22;转载 2012-10-26 14:23:08 · 957 阅读 · 0 评论 -
关键路径的实现C++ 代码
http://blog.csdn.net/hackerain/article/details/605418801.#include 02.using namespace std; 03.#define MAX 10000000 04.#define MAX_VERTEX_NUM 20 05.int ve[MAX_VERTEX_NUM]; 06./*顺序栈的定义*/ 0转载 2012-11-27 17:14:07 · 2660 阅读 · 0 评论 -
字节对齐算法
http://www.cnblogs.com/hustcat/archive/2009/05/14/1456477.html以下的内容转载自 http://www.cnblogs.com/hustcat/archive/2009/05/14/1456477.html但是其思想出自于 SGI STL 内存管理 字节对齐是在分配内存时需要考虑的问题,两个小算法:(1)最容易想到转载 2012-11-26 16:52:04 · 694 阅读 · 0 评论 -
STL系列之八 slist单链表
http://blog.csdn.net/morewindows/article/details/7186471微软的VS208所使用的PJ STL(注1)中的list是双链表,但在某些场合,一个轻量级的单链表会更加合适。单链表非常常见,这里就不去细说了,本文的slist(single linked list)单链表实现了链表的基本功能,如有需要,以后还会扩充的。slist单链表(带头结点)的转载 2012-11-12 09:19:31 · 608 阅读 · 0 评论 -
STL系列之十 全排列
http://blog.csdn.net/morewindows/article/details/7370155 全排列在笔试面试中很热门,因为它难度适中,既可以考察递归实现,又能进一步考察非递归的实现,便于区分出考生的水平。所以在百度和迅雷的校园招聘以及程序员和软件设计师的考试中都考到了,因此本文对全排列作下总结帮助大家更好的学习和理解。对本文有任何补充之处,欢迎大家指出。首先来看看转载 2012-11-13 10:50:06 · 497 阅读 · 0 评论 -
左旋字符串的应用 百度面试
转自 http://blog.csdn.net/hackbuteer1/article/details/75427744、数组al[0,mid-1]和al[mid,num-1]是各自有序的,对数组al[0,num-1]的两个子有序段进行merge,得到al[0,num-1]整体有序。要求空间复杂度为O(1)。注:al[i]元素是支持'/*数组a[begin, mid] 和 a[mid+1转载 2012-11-27 21:13:16 · 491 阅读 · 0 评论 -
STL系列之 随机数 随机重排 文件中随机取一行,生成N个随即数
http://blog.csdn.net/morewindows/article/details/7659532 本文将介绍三个有趣的随机问题,分别是随机重新排列、从文件中随机取一行数据、生成N个随机数。一.随机重新排列将一个序列打乱并对其进行随机的重新排列,关键在于每种序列的被选择概率要一样,不然有失“公平”。现在让我们来寻找如何保证每种序列被选择的概率一样大的算法。首先转载 2012-11-13 15:16:27 · 1365 阅读 · 0 评论 -
秒杀多线程第九篇 经典线程同步总结,关键段 事件 互斥量 信号量
前面《秒杀多线程第四篇一个经典的多线程同步问题》提出了一个经典的多线程同步互斥问题,这个问题包括了主线程与子线程的同步,子线程间的互斥,是一道非常经典的多线程同步互斥问题范例,后面分别用了四篇《秒杀多线程第五篇经典线程同步关键段CS》《秒杀多线程第六篇经典线程同步事件Event》《秒杀多线程第七篇经典线程同步互斥量Mutex》《秒杀多线程第八篇经典线程同步信号量Semaphore》转载 2012-11-13 16:51:23 · 519 阅读 · 0 评论 -
微软面试100题 第一题 把二元查找树转变成排序的双向链表
http://blog.csdn.net/v_JULY_v/article/details/61264061.把二元查找树转变成排序的双向链表题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 10 / / 6 14/ / / /4 8 12 16 转换成双向链表4=转载 2012-11-14 11:10:18 · 595 阅读 · 0 评论 -
分治法求解最近点对
http://blog.csdn.net/hackbuteer1/article/details/7482232http://acm.hdu.edu.cn/showproblem.php?pid=1007 先说下题意,很简单,给n个点的坐标,求距离最近的一对点之间距离的一半。第一行是一个数n表示有n个点,接下来n行是n个点的x坐标和y坐标,实数。 这个题目转载 2012-11-28 10:03:02 · 1049 阅读 · 0 评论 -
强大的和谐
http://blog.csdn.net/hackbuteer1/article/details/6725287实现一个挺高级的字符匹配算法:给一串很长字符串,要求找到符合要求的字符串,例如目的串:1231******3***2 ,12*****3 这些都要找出来,其实就是类似一些和谐系统。。。。。 这题的真正意思就是,给你一个目标串,如“123”,只要一个字符串转载 2012-11-28 10:18:14 · 950 阅读 · 0 评论