Algorithm
文章平均质量分 68
zhongjiekangping
热爱技术,追逐但不狂热...... 比较喜欢探索自己的未知领域,喜欢了解各种编程环境和领域,平时也比较喜欢阅读,用心的阅读可以使人沉淀。
展开
-
动态规划(DP)
对一种算法思想的理解需要经历从肤浅(流于表面形式)到逐渐触摸到本质的过程。为什么说"逐渐"触摸到本质,是因为很多时候你并不确定一个解释是不是最本质的,有时候会有好几个等价的解释,各自在不同的场景下具有启发。 比如对动态规划(DP)的理解,一开始我理解为"递推",但实际上这是最肤浅的理解,对于如何在特定的问题中找到递推关系毫无帮助和启发。换言之,这只是一个描述性的总结,而不是一个建设性的总结,不含方转载 2009-09-07 18:21:00 · 813 阅读 · 0 评论 -
8皇后问题
8皇后问题是一道非常经典的题目。当初我是怎么也不能明白怎么用回溯法来解此题的。现在似乎明白些了,先贴出来。 题目大家都是知道的,就不多说了。其实,题目就是要找出所有的可能情况,然后排除其中不符合条件的情况,剩下的情况即为所要求的。怎么找出所有的情况呢?对于8皇后,我们可以使用穷举法,穷举出每一种放置方法,然后判断是否符合题意。如果每次放一行,那就需要8重循环才可转载 2009-09-07 18:22:00 · 511 阅读 · 0 评论 -
Microsoft Interview
1.链表和数组的区别在哪里?2.编写实现链表排序的一种算法。说明为什么你会选择用这样的方法? 3.编写实现数组排序的一种算法。说明为什么你会选择用这样的方法?4.请编写能直接实现strstr()函数功能的代码。 5.编写反转字符串的程序,要求优化速度、优化空间。6.在链表里如何发现循环链接? 7.给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里。 8.写一个函数,检查字符是否是整数,如果是转载 2009-09-07 18:23:00 · 589 阅读 · 0 评论 -
KMP算法
个人觉得这篇文章是网上的介绍有关KMP算法更让人容易理解的文章了,确实说得很“详细”,耐心地把它看完肯定会有所收获的~~,另外有关模式函数值next[i]确实有很多版本啊,在另外一些面向对象的算法描述书中也有失效函数 f(j)的说法,其实是一个意思,即next[j]=f(j-1)+1,不过还是next[j]这种表示法好理解啊:转载 2009-09-07 18:23:00 · 1655 阅读 · 0 评论 -
各种内部排序算法的实现(c++实现)
nclude using namespace std;//调试用输出template void Print(Type a[], unsigned int n){coutfor(int i=0; i{ cout.width(4); cout}cout} //冒泡排序(升序)//时间复杂性O(n*n)template void BubbleSort(Type a[], unsigned转载 2009-09-07 18:24:00 · 637 阅读 · 0 评论 -
磁带最优存储问题(贪婪算法)
//============================================================================磁带最优存储问题:设有n个程序{1,2,……n }要存放在长度为L的磁带上。程序i 存放在磁带上的长度是li ,1Σpi=1(i=1,2,….n)。如果将这n个程序按i1,i2,…… in的次序存放,则读取程序所需的时间tr=cΣpik lik原创 2009-09-07 18:25:00 · 5880 阅读 · 0 评论 -
二叉树创建及遍历
//二叉树处理头文件//包括二叉树的结构定义,二叉树的创建,遍历算法(递归及非递归),#include "stdlib.h" #define MAXNODE 20#define ISIZE 8#define NSIZE0 7#define NSIZE1 8#define NSIZE2 15//SHOWCHAR = 1(显示字符) SHOWCHAR = 0(显示数字)#define SHOW转载 2009-09-07 18:25:00 · 835 阅读 · 0 评论 -
Knuth-Morris-Pratt string matching
Knuth-Morris-Pratt string matchingThe problem: given a (short) pattern and a (long) text, both strings, determine whether the pattern appears somewhere in the text. Last time we saw how to do this w转载 2009-09-08 14:17:00 · 668 阅读 · 0 评论 -
打靶问题 一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能行有多少种?
#include "Shot.h"Shot::Shot(void){}Shot::~Shot(void){}int Shot::ShotNum(int Nshot, int Ncounter){ int sum = 0; //最终结果 if (Nshot转载 2009-09-16 11:14:00 · 4446 阅读 · 0 评论 -
用异或实现两个数的交换的问题
void swap(int &a,int &b){a^=b;b^=a;a^=b;} a-------------------------ba^=b a^b----------------------bb^=a a^b---------b^(a^b) => aa^=b a^b^(a) => b----------aOK b-------------------原创 2009-09-15 11:36:00 · 1575 阅读 · 1 评论 -
不使用任何中间变量实现strlen
借刀杀人,不使用任何中间变量实现strlen 2009腾迅校园招聘笔试题:不使用中间变量求const字符串长度,即实现求字符串长度库函数strlen函数。函数接口声明如下:int strlen(const char *p); 思路分析:在字符串中通常可以利用最后一个结束符’/0’,但此处参数为const,只读,那么我们不能打他的主意 函数运行过程中不占用内转载 2009-09-17 20:52:00 · 1165 阅读 · 0 评论 -
二叉排序树
[转载]查找算法----二叉排序树2007-09-21 15:08当用线性表作为表的组织形式时,可以有三种查找法。其中以二分查找效率最高。但由于二分查找要求表中结点按关键字有序,且不能用链表作存储结构,因此,当表的插入或删除操作频繁时,为维护表的有序性,势必要移动表中很多结点。这种由移动结点引起的额外时间开销,就会抵消二分查找的优点。也就是说,二分查找只适用于静态查找表。若要对动态查找表进行高效率转载 2009-09-17 20:56:00 · 4468 阅读 · 0 评论 -
几个典型的内存拷贝及字符串函数实现
写一个函数,完成内存之间的拷贝。[考虑问题是否全面,是否考虑内存重叠问题] 返回void *支持链式操作,参数类型是void *以支持任意类型的指针,输入参数加上const修饰,最好加上assert对输入输出指针进行非NULL判断 void* memcpy( void *dest, const void *src, size_t count ){ char转载 2009-09-17 20:58:00 · 919 阅读 · 0 评论 -
邻接矩阵深度与广度优先遍历算法(c++实现)
邻接矩阵深度与广度优先遍历算法(c++实现) //头文件 AdjMWGraph.h#ifndef AdjMWGraph_H#define AdjMWGraph_Hclass AdjMWGraph{private:SeqList Vertices;int Edge[MaxVertices][MaxVertices];int numOfEdges;public:AdjMWGraph(const i转载 2009-09-17 20:57:00 · 3212 阅读 · 0 评论 -
不申请变量和空间反转字符串
不申请变量和空间反转字符串 要求:不申请变量和空间反转字符串,用一个函数实现。VIA笔试题 基本思路:从两头往中间做字符交换。字符串最后一个字符是/0,表示结束,没有实际意义,可以将它当作中间变量,等处理完成后,再将最后一个字符置/0即可***************************************************************转载 2009-09-17 20:51:00 · 706 阅读 · 0 评论 -
动态规划
动态规划的基本思想前文主要介绍了动态规划的一些理论依据,我们将前文所说的具有明显的阶段划分和状态转移方程的动态规划称为标准动态规划,这种标准动态规划是在研究多阶段决策问题时推导出来的,具有严格的数学形式,适合用于理论上的分析。在实际应用中,许多问题的阶段划分并不明显,这时如果刻意地划分阶段法反而麻烦。一般来说,只要该问题可以划分成规模更小的子问题,并且原问题的最优解中包含了子问题的最优解转载 2009-09-17 20:54:00 · 738 阅读 · 1 评论 -
字符串幂集
有时会遇到这样一类题目,它的问题可以分解,但是又不能得出明确的动态规划或是递归解法,此时可以考虑用回溯法解决此类问题。回溯法的优点 在于其程序结构明确,可读性强,易于理解,而且通过对问题的分析可以大大提高运行效率。但是,对于可以得出明显的递推公式迭代求解的问题,还是不要用回溯 法,因为它花费的时间比较长。回溯法的基本思想对于用回溯法求解的问题,首先要将问题进行适当的转化,得出状态空间树。转载 2009-10-07 19:04:00 · 1126 阅读 · 0 评论 -
八皇后 回溯递归实现
#include #include using namespace std;void PrintResult(int *arr, int n){ for (int i = 1; i != n + 1; ++i) cout cout }bool Verify(int *arr, int i){ /* 和前面的i - 1行比较,看当前放置位置是否合法?*/原创 2009-10-07 19:05:00 · 568 阅读 · 0 评论 -
查找表
一、查找的基本概念查找表: 是由同一类型的数据元素(或记录)构成的集合。 查找表的操作: 1、查询某个“特定的”数据元素是否在查找表中。2、检索某个“特定的”数据元素的各种属性。3、在查找表中插入一个数据元素;4、从查找表中刪去某个数据元素。 静态查找表 对查找表只作前两种操作 动态查找表 在查找过程中查找表元素集合动态改变 关键字 是数据元素(或记录)中某个数据项的值 主关键字 可以唯一的转载 2009-10-22 10:32:00 · 1213 阅读 · 0 评论 -
01背包问题 动态规划解法
动态规划是用空间换时间的一种方法的抽象。其关键是发现子问题和记录其结果。然后利用这些结果减轻运算量。比如01背包问题。/* 一个旅行者有一个最多能用M公斤的背包,现在有N件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为P1,P2,...,Pn.若每种物品只有一件求旅行者能获得最大总价值。输入格式:M,NW1,P1W2,P2......输出格式: X */因为背包最大容转载 2010-01-18 13:03:00 · 2938 阅读 · 2 评论 -
桶排序(bucket sort)
桶排序(bucket sort)从一个一维的待排序的正整数数组和一个二维整数数组开始,其中二维数组的行下标是从0到9,列下标是从0到n-1,n是一维数组中待排序值的个数。这个二维数组的每一行都成为一个桶。编写一个函数bucketSort,它采用一个整数数组和该数组的大小作为参数,并执行以下操作: a)对于一维数组的每个值,根据值的个位数,将其放到桶数组的各行中。例如,97放在第7行,3放在第3转载 2009-12-26 21:17:00 · 2402 阅读 · 1 评论 -
DP 分治 最大字段
首先用分治法:#include "stdio.h"int MaxSum(int a[],int left,int right){int i,sum=0;if(left==right)sum=a[left]>0?a[left]:0;else{int center=(left+right)/2;int leftsum=MaxSum(a,left,center);int rightsum=MaxSum(转载 2010-03-10 11:43:00 · 777 阅读 · 0 评论 -
递归和尾递归
下面两个程序是scheme写的计算阶乘的递归和尾递归实现线性递归:(define (factorial n) (if (=n 1) 1 (* n (factorial (- n 1)))))尾递归:(define (factorial n) (fact-iter 1 1 n))(define (fact-iter product counter max-co转载 2010-03-25 10:40:00 · 1466 阅读 · 0 评论 -
C#实现位图排序算法
C#实现位图排序算法 位图排序法有两个限制条件:1、待排序数据都在一个已知的相对较小的范围内;2、所有数据没有重复;输入:由n个数构成的一个序列(a1,a2,a3,……an)中(a1≠a2≠a3≠……≠an)且(an≤n)输出:重新排列的序列(b1,b2,b3,……bn),使得b1 示例:输入->5 8 1转载 2010-04-02 10:40:00 · 1278 阅读 · 0 评论 -
位图排序 c/c++
问题:给定输入文件,文件中每条记录是一个整型数(不重复),每条记录最大为n,n限制:主存不超过1MB(实际程序超过了1M)。按照《编程珠玑》上介绍,有以下几种方法:1,多通道分片读取文件,然后合并排序分片文件2,位图排序:适合于对大量不重复数据,并且数据其他相关数据。 位图排序就是使用一张表来记录关键字的存在状态(存在或不存在),然后通过采集到的状态(在/不在)通过一次遍历来确定序列顺序。转载 2010-04-02 10:45:00 · 1081 阅读 · 0 评论 -
判断单链表是否存在环,判断两个链表是否相交问题详解(转载)
None转载 2010-06-24 21:24:00 · 1094 阅读 · 0 评论 -
面试
None转载 2010-06-30 11:15:00 · 622 阅读 · 0 评论 -
查找算法集
None转载 2010-06-30 12:04:00 · 562 阅读 · 0 评论 -
求集合差的几种算法
None转载 2010-06-30 12:07:00 · 1965 阅读 · 0 评论 -
双向链表 建立
None转载 2010-07-01 11:19:00 · 452 阅读 · 0 评论 -
Huffman 编码简介
在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN)树和哈夫曼编码。哈夫曼编码是哈夫曼树的一个应用。哈夫曼编码应用广泛,如JPEG中就应用了哈夫曼编码。 首先介绍什么是哈夫曼树。哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的转载 2010-05-11 10:28:00 · 1167 阅读 · 0 评论 -
基数排序
None转载 2010-07-07 20:41:00 · 566 阅读 · 0 评论 -
分配排序
None转载 2010-07-07 20:50:00 · 916 阅读 · 0 评论 -
各种排序算法的稳定性和时间复杂度小结
None转载 2010-07-06 11:17:00 · 823 阅读 · 0 评论 -
线性链表的应用----箱排序和基数排序
None转载 2010-07-07 20:48:00 · 1223 阅读 · 0 评论 -
稀疏矩阵
一、稀疏矩阵的定义 对于那些零元素数目远远多于非零元素数目,并且非零元素的分布没有规律的矩阵称为稀疏矩阵(sparse)。 人们无法给出稀疏矩阵的确切定义,一般都只是凭个人的直觉来理解这个概念,即矩阵中非零元素的个数远远小于矩阵元素的总数,并且非零元素没有分布规律。 二、稀疏矩阵的压缩存储 由于稀疏矩阵中非零元素较少,零元素较多,因此可以采用只存储非零元素的方法来进行压转载 2010-05-13 10:32:00 · 17178 阅读 · 1 评论 -
有10亿个浮点数,从中找出1万个最大的数。
给一个基于最小二叉堆的方案: 第一阶段,向最小二叉堆中插入前一万个浮点数; 第二阶段,从第一万零一个浮点数开始,将之与最小二叉堆顶部的最小值比较。如果小于这个最小值,把最小值弹出并将新值插入到二叉堆中。重复此过程直到遍历完成。 . 创建长度一万的二叉树。 2. 遍历剩余的浮点数,若大于最小值则插入二叉树并删除最小的节点,否则略过。 这基本上是一个较优的算法,复杂度为: 千万级(一万的排序转载 2010-05-19 11:40:00 · 2200 阅读 · 0 评论 -
题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值
题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};分析:这是一道很有意思的面试题。该题以及它的变体经常出现在各大公司的面试、笔试题中。看到这道题后,第一反应是从头到尾输出比较简单。于是很自然地想到把链表中链接结点的转载 2010-05-20 16:36:00 · 5747 阅读 · 0 评论 -
红黑树(Red Black Tree)
介绍今天我们来介绍另一种平衡二叉树:红黑树(Red Black Tree),红黑树由Rudolf Bayer于1972年发明,当时被称为平衡二叉B树(symmetric binary B-trees),1978年被Leonidas J. Guibas 和 Robert Sedgewick改成一个比较摩登的名字:红黑树。红黑树和之前所讲的AVL树类似,都是在进行插入和删除操作时通过特定操作保转载 2010-05-26 10:05:00 · 21253 阅读 · 12 评论 -
c指针解决十六进制到十进制的转换
None转载 2010-07-29 11:22:00 · 1864 阅读 · 0 评论