
算法积累
文章平均质量分 94
walker lee
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
计算几何基础——矢量和叉积 && 叉积、线段相交判断、凸包(转载)
转载自 http://www.cnblogs.com/bfshm/articles/3620500.html矢量 如果一条线段的端点是有次序之分的话,那么这种线段就称为 有向线段,如果有向线段p1p2的起点p1在坐标的原点,则可以把它称为矢量 p2矢量的加减 设二维矢量 P = (x1, y1), Q = (x2, y2),则 P转载 2015-10-27 17:11:49 · 3931 阅读 · 0 评论 -
位操作实现加减乘除四则运算
位操作实现加减乘除四则运算1 先来掌握一些常用的位运算操作:(1)等式:-n = ~(n - 1) = ~n + 1;-n等于其各位取反加1。(2)获取整数n的二进制中最后一个1:n&(n - 1) 或 n&~(n - 1) 。如:n = 010100,则 -n = 101100, n&(n -1 )=000100(3)去掉整数n的二进制中最后一个1:n&(n -原创 2015-11-03 20:59:01 · 2319 阅读 · 0 评论 -
堆排序
堆排序特点堆排序(HeapSort)是一树形选择排序。堆排序的特点是:在排序过程中,将R[l..n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系(参见二叉树的顺序存储结构),在当前无序区中选择关键字最大(或最小)的记录。常用于在选出数组只最小(大)的前k个值。算法分析堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapi...原创 2015-11-07 14:29:16 · 752 阅读 · 0 评论 -
两个栈实现一个队列
两个栈实现一个队列#include #include using namespace std;templateclass Queue{public: bool empty() { return s1.empty() && s2.empty(); } void put(const T &e) { s2.push(e);原创 2015-11-18 22:20:21 · 610 阅读 · 0 评论 -
KMP算法
KMP算法1.首先是next数组求法void getNext(char *p, int *next){ int pLen = strlen(p); int k = -1; int j = 0; next[0] = -1; while (j < pLen) { if (k == -1 || p[k] == p[j]) { k++; j原创 2016-04-19 11:20:11 · 577 阅读 · 0 评论 -
递归:全排列
题目1120:全排列时间限制:1 秒内存限制:32 兆题目描述:给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。我们假设对于小写字母有'a' 输入:输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。输出:输出这个字符串的所有排列方式,每行一个排列。要求原创 2015-11-13 13:47:00 · 785 阅读 · 0 评论 -
时间复杂度
时间复杂度的估计在1秒内的运行时限, 设计的算法复 杂度不能超过百万级别,即不能超过一千万。即若算法的时间复杂度是O(n^2),则该n(往往在题目中会给出数据范围)不应大于3000,否则将会达到我们所说的千万数量级复杂度,从而程序运行时间超出题目中给出的用时限定。举例来说,我们不能在1秒时限的题目当中对10000个整数进行冒泡排序,而必须使用快速排序等时间复杂度为O原创 2015-11-09 13:44:42 · 1974 阅读 · 0 评论 -
图的深度优先遍历(DFS)
深度优先遍历递归定义深度优先遍历(Depth-First Traversal)假设给定图G的初态是所有顶点均未曾访问过。visited[i]=false;在G中任选一顶点v为初始出发点(源点),则深度优先遍历可定义如下:首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图原创 2015-11-09 14:46:48 · 777 阅读 · 0 评论 -
图的广度优先遍历(BFS)
广度优先遍历广度优先遍历是连通图的一种遍历策略。因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域,故得名。基本思想1、从图中某个顶点V0出发,并访问此顶点;2、从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点;3、重复步骤原创 2015-11-09 12:58:06 · 1840 阅读 · 0 评论 -
动态规划之0-1背包问题
动态规划之0-1背包问题动态规则:把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的方法。0-1背包问题,是用来介绍动态规划算法最经典的例子。0-1背包的状态转换方程f[i,j] = Max{ f[i-1,j-Wi]+Vi( j >= Wi ), f[i-1,j] }f[i,j]表示在前i件物品中选择原创 2015-10-22 22:00:50 · 753 阅读 · 0 评论 -
快速排序(qsort)
快速排序(qsort)代码如下:#include <stdio.h>void Qsort(int *a, int low, int high){ if (low < high) { int first = low; int last = high; int key = a[first]; // 取第一个位置为枢轴位置 while (first &...原创 2015-10-21 13:14:53 · 934 阅读 · 0 评论 -
队列实现栈
两个队列实现一个栈code:#include #include using namespace std;templateclass Stack{public: bool empty() { return q1.empty() && q2.empty(); } void put(const T &e) { q1.p原创 2015-11-18 23:01:45 · 475 阅读 · 0 评论 -
逆序对
逆序对设 A 为一个有 n 个数字的有序集 (n>1),其中所有数字各不相同。如果存在正整数 i, j 使得 1 ≤ i A[j],则 这个有序对称为 A 的一个逆序对,也称作逆序数。定义对于一个包含N个非负整数的数组A[1..n],如果有i A[ j ],则称(A[ i] ,A[ j] )为数组A中的一个逆序对。例如,数组(3,1,4,原创 2015-10-18 21:05:17 · 1347 阅读 · 0 评论 -
STL源码剖析之vector
vector1.vector概述 vector的数据安排以及操作方式,与array非常相似。两者的唯一差别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变;vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。 vector的实现技术,关键在于其对大小的控制以及重新配置时的数据移动效率。一旦vector原创 2015-12-09 20:31:55 · 701 阅读 · 0 评论 -
最长公共子序列(Longest Common Subsequence)
最长公共子序列(Longest Common Subsequence)一个字符串的子序列,是指从该字符串中去掉任意多个字符后剩下的字符在不改变顺序的情况下组成的新字符串。最长公共子序列,是指多个字符串可具有的长度最大的公共的子序列。例如,X=“ABCBDAB”,Y=“BCDB”是X的一个子序列。问题的递归式写成:递归算法如下:#inc原创 2015-10-19 21:35:55 · 1351 阅读 · 0 评论 -
归并排序
归并排序归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令原创 2015-10-18 21:38:45 · 685 阅读 · 0 评论 -
二叉树的非递归遍历
二叉树的非递归遍历说明:非递归的三种遍历都要借助栈来实现。先序、中序写法类似也较易实现,后序稍难。一、先序遍历(树根->左子树->右子树)思路:1.从当前树根结点开始,边访问边向左走,挨个入栈,走到尽头(为NULL的结点);2.栈顶结点出栈,将右结点p入栈(包括NULL),此时p为当前树根,重复1;3.直到栈空。代码如下:void原创 2015-12-05 16:47:44 · 555 阅读 · 0 评论 -
滚动数组
滚动数组滚动数组的作用在于优化空间,主要应用在递推或动态规划中(如01背包问题)。因为DP题目是一个自底向上的扩展过程,我们常常需要用到的是连续的解,前面的解往往可以舍去。所以用滚动数组优化是很有效的。利用滚动数组的话在N很大的情况下可以达到压缩存储的作用。一个简单的例子:斐波那契数列:一般代码:#include#includeusing原创 2015-12-05 22:30:05 · 774 阅读 · 0 评论 -
23个位运算技巧
20个位运算技巧1.获得int型最大值int getMaxInt(){ return (1 << 31) - 1;//2147483647, 由于优先级关系,括号不可省略} 另一种写法int getMaxInt(){ return ~(1 << 31);//2147483647}C语言中不知道int占几个字节时候int g原创 2015-12-16 13:53:48 · 2511 阅读 · 0 评论 -
冒泡排序(bubbleSort)
冒泡排序(bubbleSort) 冒泡->改进->再改进。 原始的冒泡排序算法: #include <stdio.h>void swap(int &x, int &y){ int t = x; x = y; y = t;}int main(){ int num[30] = { 5, 3, 2, 6, 7,...原创 2015-10-20 18:04:26 · 724 阅读 · 0 评论