
数据结构与算法
文章平均质量分 73
penzo
这个作者很懒,什么都没留下…
展开
-
hash_map和map的区别
这里列几个常见问题,应该对你理解和使用hash_map比较有帮助。 1 hash_map和map的区别在哪里?构造函数。hash_map需要hash函数,等于函数;map只需要比较函数(小于函数). 存储结构。hash_map采用hash表存储,map一般采用红黑树(RB Tree)实现。因此其memory数据结构是不一样的。 2 什么时候需要用hash_map,什么时候需要用map?总体来说,hash_map 查找速度会比map快,而且查找速度基本和数据量大小无关,属于常数级别;而map的查找速度是log转载 2010-11-04 10:36:00 · 538 阅读 · 0 评论 -
POJ 2593
<br />Max Sequence:求两个子序列的最大和,此题与POJ 2479算法完全一致,均采用动态规划求解。<br />测试数据:<br />10<br />1 -1 2 2 3 -3 4 -4 5 -5<br />5<br />-5 9 -5 11 20<br />6<br />3 3 -3 4 -2 1<br />0<br />正确的运行结果是:<br />13<br />40<br />10<br />代码如下#include <iostream>using namespace std;原创 2010-11-10 21:48:00 · 941 阅读 · 0 评论 -
POJ 1047
<br />问题描述:判断一个数是否为“环数”。此题较简单,思路是:将大整数的每一位存入数组元素,再对该数乘以位数,从2->n,对乘积的结果与原来的大整数比较,如果不同,则退出不再乘以后面的位数;若所有位数都乘完了,并且都满足条件,则判断为是“环数”。<br /> #include <iostream>#include <string.h>#define MAX_LEN 60using namespace std;unsigned aNum[MAX_LEN+10];unsigne原创 2010-11-10 21:37:00 · 1064 阅读 · 0 评论 -
回溯法—算法框架及基础
回溯法其实也是一种搜索算法,它可以方便的搜索解空间。 回溯法解题通常可以从以下三步入手: 1、针对问题,定义解空间 2、确定易于搜索的解空间结构 3、以深度优先的方式搜索解空间,并在搜索的过程中进行剪枝 回溯法通常在解空间树上进行搜索,而解空间树通常有子集树和排列树。 针对这两个问题,算法的框架基本如下: 用回溯法搜索子集合树的一般框架:void backtrack(int t){ if(t > n) output(x); else{ for(int i = f转载 2010-11-10 21:13:00 · 1301 阅读 · 0 评论 -
尾递归
<br />今天在看《数据结构与算法分析》时,遇到了尾递归这一词,在网上查了资料,遂以此记录下来:<br />转http://blog.youkuaiyun.com/lee576/archive/2008/07/31/2747517.aspx<br />尾递归 - Tail Recursion<br /><br />尾递归是针对传统的递归算法而言的, 传统的递归算法在很多时候被视为洪水猛兽. 它的名声狼籍, 好像永远和低效联系在一起.<br /><br />尾递归就是从最后开始计算, 每递归一次就算出相应的结果, 也就原创 2010-11-10 22:00:00 · 768 阅读 · 0 评论 -
POJ 1573
<br />纸片翻转,问题详见:http://acm.pku.edu.cn/JudgeOnline/problem?id=1753<br />======================<br />问题分析<br />======================<br />状态:<br />若将b看成1,w看成0,一个状态对应一个值(0~65535),记为id,最多有2^16个id。<br />翻转:<br />将当前纸片的周围四个方向(如果有)进行翻转,得到下一个id。某纸片翻转后,当前id与翻转的位对应原创 2010-11-10 21:56:00 · 524 阅读 · 0 评论 -
POJ1328
<br />Radar Installation<br />题目:给一些孤岛(用坐标x,y表示),x轴为海岸线,在海岸线上建立几个雷达站,每个雷达站的覆盖区域为一个圆,半径给出。问最少要几个雷达站,才能覆盖所有孤岛。<br />这个问题需要注意两点:<br />1、将问题转化<br />以每个孤岛为圆心,已知半径画圆,交海岸线于两点,得到一个区间。在区间上任一一点建立雷达站均可覆盖目标点。于是问题变为:给n个区间,选出最少的点使得每个区间至少有一个点。<br />2、贪心算法<br />将每个区间按左边进行原创 2010-11-10 21:50:00 · 682 阅读 · 0 评论 -
求二叉树中两节点的最近公共祖先
<br />思路:最近公共祖先有一个好的特点,设A,B两个节点的过最近公共祖先C,那么A,B必然在C的两支上。<br />程序:<br />#include <stdio.h>#include <stdlib.h>struct Node{ const Node *left, *right; const char* name; Node(const Node *left, const Node *right, const char* name)转载 2010-11-11 15:40:00 · 1963 阅读 · 0 评论 -
POJ 1088
<br />5 5<br />1 2 3 4 5<br />16 17 18 19 6<br />15 24 25 20 7<br />14 23 22 21 8<br />13 12 11 10 9<br />典型的动态规划算法,满足(1)(2)两条件:<br />(1)重复子问题:如24->17,需要求17的最长路径,而18->17,也需要求17的最长路径,这就存在一个重复的子问题。<br />(2)最优子结构:从24出发的最长路径,包括了23出发的最长路径。。。,即包含了最优的子结构。<br />设计原创 2010-11-10 21:54:00 · 487 阅读 · 0 评论 -
动态规划与贪心算法的区别与联系
<br />区别:<br />动态规划<br />全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解。<br />条件:最优子结构;重叠子问题。<br />方法:自底向上构造子问题的解。<br />例子:子序列最大和问题,滑雪问题<br />贪心算法<br />条件:每一步的最优解一定依赖上一步的最优解。<br />方法:从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到某算法中的某一步不能再继续前进时,算法停止。<br />存在问题:原创 2010-11-10 21:43:00 · 8382 阅读 · 0 评论 -
POJ 1001 Exponentiation
<br />参考了《Programming_guide_and_online_practice-4.23bylwx》的第七章大整数计算,解题思路是先将浮点数转化成大整数进行计算,再算出小数的位数,最后打印输出。<br />POJ上题目中给的数据都能测试通过,但提交是Wrong Answer,可能是没考虑特殊的输入。这里仅贴出代码,供参考。<br />#include <iostream>#include <string.h>#define MAX_LEN 102using namespace原创 2010-11-10 21:39:00 · 992 阅读 · 0 评论 -
二叉树三种遍历方式的递归与非递归实现
先序遍历——递归void preorder(node* root){if (root) printf(“%d/n”, root->value);else return;preorder(root->left);preorder(root->right);}先序遍历——非递归void preoder(node* root){element* theStack;void* data;node* curNode;CreateStack(&theSta原创 2010-11-10 21:24:00 · 544 阅读 · 0 评论 -
重建二叉树_《编程之美》3.9
<br />/*根据先序遍历和中序遍历的字符串,构造出树*//*先序遍历树,使用递归和非递归两种方法*/#include <iostream>using namespace std;struct NODE{NODE* pLeft;NODE* pRight;char chValue;};#define STACKSIZE 10typedef NODE *datatype;typedef struct _stack_{datatype da原创 2010-11-10 21:07:00 · 603 阅读 · 0 评论 -
求序列连续数最大和
<br />-2,11,-4,13,-5,-2<br />思路:序列a[n],记<br />f(i):前i个数中连续数最大和;<br />end(i):以下标i结尾的前i个数中连续数最大和。<br />有以下递推式:<br />f(i) = max{f(i-1), end(i)};<br />当end(i-1)<=0,end(i) = a[i];否则end(i) = end(i-1)+a[i]。<br />以front,rear指针记录连续最大和的首尾下标。<br />程序如下:<br />#include原创 2010-11-11 16:28:00 · 764 阅读 · 0 评论 -
POJ 2479
<br />输入:<br />1 -1 2 2 3 -3 4 -4 5 -5<br />思路:<br />这是一个动态规划的问题,满足DP的两个条件:重叠子问题和最优子结构。<br />采用自底向上的设计策略,先从左至右计算出每个段的最大子序列和a[i],再反过来,从右至左计算每个段的最大子序列和b[i],最后遍历每个段,求出a[i]+b[i]的最大值,即为最后所求值。<br />代码:<br />#include <iostream>#include <stdio.h>using namespac原创 2010-11-10 21:52:00 · 854 阅读 · 0 评论 -
常用内部排序的实现
<br />/**归并排序,改写自《数据结构C语言版》,P284*/#include <iostream>#define LENGTH 20using namespace std;void output(int* a, int len){ int i; for (i = 0; i < len; i++) cout << a[i] << " "; cout << endl;}//将a[i..m]到a[m+1..n]归并到b[i..n]void原创 2010-11-10 21:33:00 · 510 阅读 · 0 评论 -
0-1背包问题的两种解法(回溯法和动态规划)
问题描述:一个旅行者有一个最多能用M公斤的背包,现在有N件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为P1,P2,...,Pn.若每种物品只有一件求旅行者能获得最大总价值。解法一——动态规划因为背包最大容量M未知。所以,我们的程序要从1到M一个一个的试。比如,开始任选N件物品的一个。看对应M的背包,能不能放进去,如果能放进去,并且还有多的空间,则,多出来的空间里能放N-1物品中的最大价值。怎么能保证总选择是最大价值呢?看下表。测试数据:10,33,44,55,6c[i][j]数组保存了1原创 2010-11-06 22:49:00 · 3912 阅读 · 1 评论 -
二叉查找树的删除操作
<br />这两天断断续续看了BST的内容,对其删除操作的递归实现有了一定理解。<br />删除操作的递归实现:<br />SearchTree Delete(ElementType X, SearchTree T){ Position TmpCell; if (T == NULL) printf("Element not found/n"); else if (X < T->Element) T->Left = Delete(X, T-原创 2010-11-10 21:59:00 · 958 阅读 · 0 评论