经典基础算法
知之可否
这个作者很懒,什么都没留下…
展开
-
精确到小数n位
习题2-5 分数化小数(decimal) 输入正整数a, b, c,输出a/b的小数形式,精确到小数点后c位。a, b <= 10^6,c <= 100。例如a=1, b=6, c=4时应输出0.1667。printf有特殊的用法printf("%*.*lf\n", 8, 4, (double)10/3);会输出8个字宽保留4位小数的浮点数运算结果所有#include <stdio.h>int m转载 2015-04-19 22:29:46 · 4371 阅读 · 2 评论 -
乘法逆元
带模的除法:求 a / b = x (mod M)只要 M 是一个素数,而且 b 不是 M 的倍数,就可以用一个逆元整数 b’,通过 a / b = a * b’ (mod M),来以乘换除。费马小定理说,对于素数 M 任意不是 M 的倍数的 b,都有: b ^ (M-1) = 1 (mod M)于是可以拆成:b * b ^ (M-2) = 1 (mod M)于是:a / b = a / b转载 2016-05-14 23:03:04 · 405 阅读 · 0 评论 -
筛选法求素数
所谓“筛选法”指的是“埃拉托色尼(Eratosthenes)筛法”。他是古希腊的著名数学家。他采取的方法是,在一张纸上写上1到100全部整数,然后逐个判断它们是否是素数,找出一个非素数,就把它挖掉,最后剩下的就是素数。具体做法如下: 先将1挖掉(因为1不是素数)。 用2去除它后面的各个数,把能被2整除的数挖掉,即把2的倍数挖掉。 用3去除它后面的各数,把3的倍数挖掉。 分别转载 2016-05-15 21:33:02 · 470 阅读 · 0 评论 -
后缀数组求最长重复子串
问题描述给定一个字符串,求出其最长重复子串例如:abcdabcd最长重复子串是 abcd,最长重复子串可以重叠例如:abcdabcda,这时最长重复子串是 abcda,中间的 a 是被重叠的。改进的方法是利用后缀数组后缀数组是一种数据结构,对一个字符串生成相应的后缀数组后,然后再排序,排完序依次检测相邻的两个字符串的开头公共部分。这样的时间复杂度为:生成后缀数组原创 2016-05-16 11:00:31 · 1213 阅读 · 0 评论 -
归并排序
分治三部走(算法竞赛入门经典P225): 划分问题、递归问题、合并问题;#include<iostream>using namespace std;void merge_sort(int *A,int x,int y,int *T){//[x,y)左闭右开区间 if ((y-x)>1){//大于1,一个没必要划分再排序 int m = x + (y - x) / 2;原创 2015-11-04 12:00:23 · 527 阅读 · 0 评论 -
背包问题
1.0-1背包http://acm.hdu.edu.cn/showproblem.php?pid=2602 #include#include#includeusing namespace std;int dp[1002];int vol[1002];int val[1002];int main(){ //freopen("test.txt", "r", stdi转载 2016-05-30 16:49:35 · 601 阅读 · 0 评论 -
最小生成树:Kruskal算法
用并查集来判断是否存在回路,详见算法导论http://acm.hdu.edu.cn/showproblem.php?pid=1863Problem Description省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成原创 2016-05-31 11:18:37 · 511 阅读 · 0 评论 -
简单计算器
http://acm.hdu.edu.cn/showproblem.php?pid=1237#include #include #include #include using namespace std;int main(){ //freopen("test.txt", "r", stdin); char str, c; double a, b; stack n转载 2016-06-03 11:08:12 · 835 阅读 · 0 评论 -
并查集(Disjoint Set)
在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在规定的运行时间(1~3秒)内计算出试题需要的结果,只能用并查集转载 2016-05-21 21:26:13 · 1805 阅读 · 0 评论 -
Little's Law(利特尔法则)的简要证明和重要应用(2012年某公司实习生招聘笔试试题)
我们先看Little's Law: 在一个稳定的系统中,长时间观察到的平均顾客数量L,等于,长时间观察到的有效到达速率λ与平均每个顾客在系统中花费的时间之乘积,即L = λW 实际上, 这个定律是很好理解的。 假设, 我们有一段水管, 横截面积为2平方米, 水速度为5米/秒, 也就是说水的流量速度是10立方米/秒, 那么, 我们自转载 2016-07-05 10:54:40 · 902 阅读 · 0 评论 -
全排列实现
1.无重复对象全排列参考的是《算法竞赛入门》P185 方法是用一个额外的数组A,不断放入对象到这个数组中,直到n个为止。#include<iostream>using namespace std;int total = 0;void permutation(char* S,char* A,int n,int cur){ if (cur == n){ for (int i原创 2015-12-28 22:43:03 · 496 阅读 · 0 评论 -
幂模运算
在众多的加密算法中都需要进行幂的取模运算,比如在RSA算法中需要计算ne mod N,我们称之为幂模算法。我原创 2014-11-02 09:57:34 · 3153 阅读 · 0 评论 -
快速排序
快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快速转载 2015-11-07 23:11:24 · 601 阅读 · 0 评论 -
B树,B+树
1.前言:动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树(Red-Black Tree ),B-tree/B+-tree/ B*-tree (B~Tree)。前三者是典型的二叉查找树结构,其查找的时间复杂度O(log2N)与树的深度相关,那么降低树的深度自然会提高查找效率。但转载 2016-05-09 16:58:41 · 721 阅读 · 0 评论 -
随机数范围扩展方法总结
http://blog.csdn.net/hackbuteer1/article/details/7486704题目:已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。分析:要保证rand10()在整数1-10的均匀分布,可以构造一个1-10*n的均匀分布的随机整数区间(n为任何正整数)。假设x是这个1-10*n区间上的转载 2016-09-28 18:39:06 · 465 阅读 · 0 评论 -
数据结构:循环队列(C语言实现)
生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题;从生活中,可以抽象出队列的概念,队列就是一个能够实现“先进先出”的存储结构。队列分为链式队列和静态队列;静态队列一般用数组来实现,但此时的队列必须是循环队列,否则会造成巨大的内存浪费;链式队列是用链表来实现队列的。这里讲的是循环队列,首先我们必须明白下面几个问题一、循环队列的基础知识转载 2016-09-29 15:44:34 · 395 阅读 · 0 评论 -
二分查找上界和下界
详细见详细见《算法竞赛入门》P229这里用的是左闭右开空间[left , right)upper_bound返回的是target应该插入的位置或者最后一次出现位置的下一个位置这里的实现就跟STL中的这两个函数功能类似STL源码学习—-lower_bound和upper_bound算法#include<vector>#include<iostream>using namespace st原创 2016-01-26 13:49:04 · 2135 阅读 · 0 评论 -
编程珠玑:位图法排序
题描述输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=107。如果在输入文件中有任何正数重复出现就是致命错误。没有其他数据与该正数相关联。输出:按升序排列的输入正数的列表。约束:最多有1MB的内存空间可用,有充足的磁盘存储空间可用。运行时间最多几分钟,运行时间为10秒就不需要进一步优化。若用计数排序需要空间 10^7/(8*1024*转载 2016-05-12 20:36:43 · 1338 阅读 · 0 评论 -
闰年综述
地球围绕太阳转,这是众所周知的事情。然天文学与数学两个学科的内在联系,我想却知者甚少。 当地球绕太阳转一周需要365天5时48分46秒,计算成天数也就是365.2422天。在公历纪年中,为了方便,一年定为365天,叫做平年;而平年一年有365天,它比一回归年少着0.2422天,在四年中就要少0.9688天接近于一天时间,故每四年需要增加一天,这一年有366天,就是闰年。通常把这一天加在2月份里,转载 2015-04-14 23:05:38 · 568 阅读 · 0 评论 -
中间溢出
例题2-2 3n+1问题 猜想:对于任意大于1的自然数n,若n为奇数,则将n变成3n+1,否则变成一半 经过若干次这样的变换,一定会使n变成1.例如3->10->5->16->8->4->2->1 输入n,输出变换的次数。n≤10^9. 样例输入:3 样例输出:7 粗看没有问题。 int假设是32位,那么最大可取到2^31+1=2147483649,也就是21亿4千原创 2015-04-15 22:24:27 · 805 阅读 · 0 评论 -
四舍五入
double x; ….. floor(x+0.5);能达到四舍五入的效果跟java里的Math.round(x)功能相同看《算法竞赛入门经典》19里的解释:原创 2015-04-15 21:37:56 · 2395 阅读 · 0 评论 -
闭包
http://wenku.baidu.com/link?url=r-ufA-ZHKbWm4OOJK1J4GHpEBs6t0PpQoreRHUjkW1ViEy4xVcn4rOABWM2Ff1Cm72WDKcbM_o1BBgl_feEX4524HfGULCCi9FEVPQyw3aa 传递闭包的计算过程一般可以用Warshell算法描述: For 每个节点i Do For 每个原创 2015-05-06 22:51:39 · 785 阅读 · 0 评论 -
冒泡排序
冒泡排序是一种交换排序#include<iostream>using namespace std;void bubble_sort(int a[],int n){ for (int i = 0; i < n;i++){//外循环,趟数 //内循环 //第0趟:a[0]--a[n-1]都是无序区,如果不满足a[j]<a[j-1],则相邻的交换原创 2015-11-11 23:19:32 · 461 阅读 · 0 评论 -
sort自定义cmp函数
1.改写comp从大到小排序。#include<iostream>#include<vector>#include<algorithm>using namespace std;bool comp(const int &a,const int &b){ return a>b;}int main(){ vector<int>v; v.push_back(13);原创 2015-11-02 22:22:10 · 17084 阅读 · 2 评论 -
表达式运算
通常我们所看到的算术表达式,运算符总是在两个操作数中间(除),如(A+B)*C,这样的表达式叫做中缀表达式。这种表达式不同的运算符优先级不同,而且通常含有括号,计算机很难理解这种表达式。在编译系统中,要把人易于理解的表达式翻译成能正确求值的机器指令。编译系统中对中缀形式的算术表达式的处理方式是: 先把中缀表达式转换成后缀表达式,再进行计算。 后缀表达式就是表达式中的运算符出现在操作数的后面,并且不转载 2015-12-29 11:51:13 · 657 阅读 · 0 评论 -
洗牌算法:随机打乱一组数
扑克牌洗牌是我们生活中比较喜欢玩的一个游戏。那么我们有没有什么办法自己设计一个扑克牌洗牌的方法呢?在c运行库当中有一个随机函数rand,它可以生成0~32767之间的任意数。那么有没有可能利用这么一个函数对我们扑克牌进行随即洗牌呢? 在这里我抛砖引玉一下,谈一谈自己目前已经看到的两个算法。欢迎朋友们谈一谈其他的方法。 (1)全局洗牌法 步骤如下所示:转载 2016-03-22 15:57:35 · 2938 阅读 · 0 评论 -
二叉树的非递归遍历
1.前序遍历void preOrder2(BinTree *root) //非递归前序遍历 { stack<BinTree*> s; BinTree *p=root; while(p!=NULL||!s.empty()) { while(p!=NULL) { cout<<p->data<<" ";转载 2016-04-01 11:24:28 · 414 阅读 · 0 评论 -
x&(x-1)的含义
求下面函数的返回值(微软) ———统计1的个数int func(int x){int countx = 0;while(x){countx++;x = x&(x-1);}return countx;} 假定x = 9999 10011100001111 答案: 8 思路: 将x转化为2进制,看含有的1的个数。 注: 每执行一次x = x&(x-1),会将x用二进制表示时最右转载 2016-04-10 20:46:39 · 2470 阅读 · 0 评论 -
Trie树详解及其应用
主要转自 http://blog.csdn.net/hackbuteer1/article/details/7964147一、知识简介 最近在看字符串算法了,其中字典树、AC自动机和后缀树的应用是最广泛的了,下面将会重点介绍下这几个算法的应用。 字典树(Trie)可以保存一些字符串->值的对应关系。基本上,它跟 Java 的 HashMap 功能相同,都转载 2016-05-09 23:09:00 · 10988 阅读 · 1 评论 -
KMP算法
前言 之前对kmp算法虽然了解它的原理,即求出P0···Pi的最大相同前后缀长度k;但是问题在于如何求出这个最大前后缀长度呢?我觉得网上很多帖子都说的不是很清楚,总感觉没有把那层纸戳破,后来翻看算法导论,32章 字符串匹配虽然讲到了对前后缀计算的正确性,但是大量的推理证明不大好理解,没有与程序结合起来讲。今天我在这里讲一讲我的一些理解,希望大家多多指教,如果有不清楚的或错误的请给转载 2016-05-10 17:14:52 · 857 阅读 · 1 评论 -
先序序列构建二叉树
5 / \ 7 3 \ 6 这棵树仅用先序可以这样表示5 7 -1 6 -1 -1 3 -1 -1如果仅输入-1表示空树#include<iostream>using namespace std;struct node{ int data; node* left; node* right; node() :data(0), lef原创 2015-09-21 21:43:21 · 3414 阅读 · 0 评论 -
堆排序
堆排序是一种选择排序。堆定义堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: 如果节点索引从0开始: Key[i]<=key[2i+1]&&Key[i]<=key[2i+2](小顶堆)或者:Key[i]>=Key[2i+1]&&key>=key[2i+2](大顶堆) 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。堆排序的思想利用大顶堆(小顶堆)堆顶记录的是最大关键字(最小原创 2016-05-11 16:02:47 · 361 阅读 · 0 评论 -
三种线性排序算法: 计数排序、桶排序与基数排序
[非基于比较的排序]在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销。排序算法有非常多种,如我们最常用的快速排序和堆排序等算法,这些算法需要对序列中的数据进行比较,因为被称为基于比较的排序。而非基于比较的排序,如计数排序,桶排序,和在此基础上的基数排序,则可以突破O(NlogN)时间下限。但要注意的是,非基于比较的排序算法的使用都是有条件原创 2016-05-12 17:32:08 · 601 阅读 · 0 评论