
算法
文章平均质量分 73
leileicaocao
这个作者很懒,什么都没留下…
展开
-
排序
冒泡排序Bubble SortO(N*N)将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 插入排序Insertion sortO(N*N)逐一取出元素,在已经排序的元素序列中从后向前扫描,放到适当的位置起初,已经排序的元素序列为空选择排序O(N原创 2013-05-21 09:05:32 · 364 阅读 · 0 评论 -
(三)红黑树
#ifndef _RB_TREE_#define _RB_TREE_#include #include using namespace std;void TestRBTree();/* 性质: 1.每个节点要么是红色的,要么是黑色的 2.根节点是黑色的 3.每个叶节点是黑色的 4.如果节点是红色的,则它的两个子节点都必须是黑色的 5.对于每个节点,从该节原创 2013-05-24 09:06:51 · 442 阅读 · 0 评论 -
(五)遗传算法
#ifndef _GA_#define _GA_#include #include using namespace std;void TestGA();/* 1.初始化 :随机生成M个群体。T:进化代数。M:初始种群的个数 2.个体评价:计算各个个体的适应度 3.选择运算:选择子个体,将选择算子作用于群体 4.交叉运算:将交叉算子作用于群体 5.变异运算:将变异算子作原创 2013-05-25 12:35:34 · 1013 阅读 · 0 评论 -
(六)快速排序
#ifndef _SORT_#define _SORT_#include #include using namespace std;void TestSort();int Partition(int *arr, int left, int right);int Partition2(int *arr, int left, int right);void QuickSor原创 2013-05-25 12:35:47 · 402 阅读 · 0 评论 -
算法方面的一些书籍和网上资源
书籍:算法数学基础:具体数学全面介绍算法:算法导论计算机程序设计的艺术图论算法:组合算法:数论算法:计算几何:一些大学的OJ:北京邮电大学 Online Judge (BOJ) http://acm.cs.bupt.cn/onlinejudge/我的母校,呵呵,建得比较晚,不过现在人气越来越旺,最近转载 2013-06-03 20:02:49 · 467 阅读 · 0 评论 -
PKU Online Judge POJ流传最广的分类,希望以后会切之
多版本的POJ分类 流传最广的一种分类: 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj3295) 转载 2013-06-03 20:04:39 · 1525 阅读 · 0 评论 -
在数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数
转载:http://blog.youkuaiyun.com/beiyeqingteng/article/details/7167823问题:一个int数组, 比如 array[],里面数据无任何限制,要求求出所有这样的数array[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。分析:最原始的方法是检查每一个数 array[i转载 2013-06-04 16:47:19 · 580 阅读 · 0 评论 -
字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串
1. 最长回文串一般用后缀数组或者后缀树可以解决,用此方法:http://blog.youkuaiyun.com/v_july_v/article/details/6897097预处理后缀树,使得查询LCA的复杂度为O(1)。这步的开销是O(N),N是单词S的长度 ;对单词的每一位置i(也就是从0到N-1),获取LCA(S(i), S‘(N-i-1)) 以及LCA(S(i),转载 2013-06-04 17:08:16 · 713 阅读 · 0 评论 -
从Trie树(字典树)谈到后缀树
作者:July、yansha。出处:http://blog.youkuaiyun.com/v_JULY_v 。 引言 常关注本blog的读者朋友想必看过此篇文章:从B树、B+树、B*树谈到R 树,这次,咱们来讲另外两种树:Tire树与后缀树。不过,在此之前,先来看两个问题。 第一个问题: 一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,转载 2013-06-04 17:18:22 · 602 阅读 · 0 评论 -
随机算法
http://www.searchtb.com/2010/12/random-algorithm.html void SelectMNumberFromN(int arr[], int n, int m){ for (int i = 0; i < n && m; ++i) { // p(i) < m / (n - i) if (rand() % (n - i) < m)转载 2013-06-04 15:01:48 · 1381 阅读 · 1 评论 -
翻转数组中的最小数
剑指offer中大体思路while (a[left] >=a[right]){ if (left + 1 == right) return a[right]; int mid = left + (right - left) / 2; if (arr[left] == arr[mi原创 2013-06-04 17:41:03 · 451 阅读 · 0 评论 -
(四)KMP算法
#ifndef _KMP_#define _KMP_#include #include using namespace std;void TestKMP();int Match1(const string &target, const string &pattern);/* 根据事先的信息,在失配时,直接移动到相应位置*//* KMP:不好理解的地方 1.覆盖原创 2013-05-24 09:07:03 · 438 阅读 · 0 评论 -
非递归实现交换二叉树的左右子节点
思路一: 两个队列思路二: 栈struct TreeNode{ int m_nValue; TreeNode *m_pLeft; TreeNode *m_pRight;};void ExchangeNode(TreeNode *pRoot){ stack s; if (pRoot) s.push(pRoot); whil原创 2013-05-25 12:35:20 · 1936 阅读 · 0 评论 -
(二)Dijkstra算法
#ifndef _DIJKSTRA_#define _DIJKSTRA_#include using namespace std;void TestDijstra();const int MAX_NODE = 1000;/* 最简单的:用二维数组来记录Graph和weight 斐波那契堆实现:insert,get 1.最普通实现 2.使用二叉堆实现 3.实现fibon原创 2013-05-24 09:06:43 · 486 阅读 · 0 评论 -
(13)字符串哈希
#include #include using namespace std;void TestReverseIndex();const unsigned HASH_SIZE = 1024;const unsigned CRYPT_SIZE = 0x100;// 索引节点struct KeyNode{ string strKey; int count; int pos;原创 2013-05-24 09:04:57 · 482 阅读 · 0 评论 -
约瑟夫环
链表、数组模拟递推:f[1] = 0;f[i] = (f[i-1] + m) mod i问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。我们知道第一个人(编号一定是(m-1) mod n) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m mod n的人开始):k k+1 k+2原创 2013-05-23 09:20:42 · 461 阅读 · 0 评论 -
(8)虚函数测试
#include using namespace std;void TestVirtualFunction();void TestVirtualClass();void TestDrivedClass();void TestDefaultParam();/* 1.如果调用非虚函数,则无论实际对象是什么类型,都执行基类类型所定义的函数 2.如果调用虚函数,则直到运行时才原创 2013-05-23 09:22:39 · 570 阅读 · 0 评论 -
(9)链表追赶
#include using namespace std;// 认真分析具体情况,当把问题分析透了时,解决方案也就一目了然了/* 1.如果两个都没有环:看结尾节点是否相同 2.如果一个有环,一个没有,则必定分离 3.如果两个都有环(node1,node2:分别是入环节点),看是否能从node1遍历到node2 如果有环,且相交的话,则两个链表的环一定是相同的*/void T原创 2013-05-23 09:22:45 · 541 阅读 · 0 评论 -
(1)左旋转字符串
/* * 左旋转字符串: * abcdef,左旋转2,得到cdefab * ------------------------- * void LeftRotate(char* arr, int length, int num); * 时间复杂度O(n), 空间复杂度O(1) */void LeftRotate(char* arr, int length, int num);void原创 2013-05-23 09:21:39 · 491 阅读 · 0 评论 -
(5)寻找满足条件的两个或多个数
#include #include #include using namespace std;/* * 输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字 * 要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可 * 例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11*//* 1.二分查找原创 2013-05-23 09:22:01 · 529 阅读 · 0 评论 -
(7)连续子数组问题
#include using namespace std;/* 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5, 和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18。原创 2013-05-23 09:22:15 · 505 阅读 · 0 评论 -
二叉树遍历
非递归实现交换二叉树的左右子节点思路一: 两个队列思路二: 栈struct TreeNode{ int m_nValue; TreeNode *m_pLeft; TreeNode *m_pRight;};void ExchangeNode(TreeNode *pRoot){ stack s; if (pRoot)原创 2013-05-23 09:20:32 · 397 阅读 · 0 评论 -
(2)字符串包含问题
/* * 字符串是否包含问题: * A:abcdef * B:cf * C:bx * StringContains(A, B), 返回ture * StringContains(A, C), 返回false *//************************************************************1.Length(A) >= Length(B原创 2013-05-23 09:21:45 · 535 阅读 · 0 评论 -
(10)大数据外存归并排序
#include #include #include using namespace std;// 可以尝试先写测试用例...void TestDiskSort();/* 输入:一个最多含有n个不重复的正整数(也就是说可能含有少于n个不重复正整数)的文件, 其中每个数都小于等于n,且n=10^7。 输出:得到按从小到大升序排列的包含所有输入的整数的列表。 条件:最原创 2013-05-23 09:22:49 · 1783 阅读 · 0 评论 -
(6)亲和数问题
#include #include using namespace std;/* 求500万以内的所有亲和数 如果两个数a和b,a的所有真因数之和等于b, b的所有真因数之和等于a,则称a,b是一对亲和数。 例如220和284,1184和1210,2620和2924。 真因数:不包含本身的所有因数 220的真因子是:1、2、4、5、10、11、20、22、44、55、110;原创 2013-05-23 09:22:07 · 1216 阅读 · 0 评论 -
(11)最长公共子序列
#include using namespace std;void TestLongestCommenString();/* 1 3 4 5 5 ,and 2 4 5 5 7 6 最长公共子序列是:4 5 5 动态规划问题*//* c[i][j] = c[i-1][j-1] + 1 (a[i] == b[j]) = max{c[i][j-1], c[i-1][j]}原创 2013-05-23 09:22:55 · 514 阅读 · 0 评论 -
(一)Astar算法
#ifndef _A_STAR_#define _A_STAR_#include #include #include #include using namespace std;void TestAStar();/* 八数码: 硬编码,没考虑扩展*//* 1.找到从source到dest的过程*/// 节点状态结构struct NodeState{原创 2013-05-24 09:06:18 · 550 阅读 · 0 评论 -
(12)杂
#include #include using namespace std;void TestDataStructureBitMap();/* 给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数, 如何快速判断这个数是否在那40亿个数当中 1.位图算法 2.Hash算法 3.如何利用不用排序? 不用一次把所有的都读入内存啊?*//*原创 2013-05-24 09:04:49 · 469 阅读 · 0 评论 -
DP:segment string
Segment a long string into a set of valid words using a dictionary. Return the maximum number of the subwords.此题出自facebook面试题。方法一:套用矩阵连乘积模型。复杂度O(N^3)int segmentString(string str, set dict){ //原创 2013-09-03 18:42:45 · 679 阅读 · 0 评论