算法导论 && ACM
文章平均质量分 56
JKhere
程序猿
展开
-
《计算机算法设计与分析(第3版)》算法分析题2-3
算法分析题2-3设a[0:n-1]是已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。#include using namespace std;class Point{public: int i; int j; Point() { i=0; j原创 2013-03-18 16:44:13 · 1883 阅读 · 0 评论 -
常用插值算法介绍(二)
双线性内插值算法描述如下: 对于一个目的像素,设置坐标通过反向变换得到的浮点坐标为(i+u,j+v) (其中i、j均为浮点坐标的整数部分,u、v为浮点坐标的小数部分,是取值[0,1)区间的浮点数),则这个像素得值 f(i+u,j+v) 可由原图像中坐标为 (i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)所对应的周围四个像素的值决定,即: f(i+u,j+v) = (原创 2013-09-21 16:53:04 · 1713 阅读 · 0 评论 -
基于opencv的双线性插值的实现(一)
#include #include #include using namespace std;float Abs(float f);void zoom(IplImage* src, IplImage* dst);int main() { // read an image IplImage* src = cvLoadImage("E://pic//view.jpg");原创 2013-09-22 16:11:39 · 2425 阅读 · 0 评论 -
基于opencv的双线性插值的实现(二)
上篇博客用实现了基于双线性插值算法的图像缩放,主要函数zoom中大量使用了指针。采用指针来读取图像像素,优点是执行速度快,缺点是代码不易阅读。本篇采用opencv库中自带的cvGet2D()和cvSet2D()函数来读写图像像素,虽然执行速度较慢,但代码阅读性强,简单明了。下面是主要函数zoom的实现,其他部分参考我的上一篇博客。void zoom(IplImage* src, Ipl原创 2013-09-22 19:27:34 · 4489 阅读 · 0 评论 -
常用插值算法介绍(三)
双三次插值(也称协调板元),二元双三次插值公式共有(3+1)2=16个系数,其一般形式可写成: a00 + a10x + a01y + a20x2 + a11xy + a02y2 + a21x2y + a12xy2 + a22x2y2 + a30x3 + a03y3 + a31x3y + a13xy3 + a32x3y2 + a23x2y3 + a33x3y3 或者更简单的形式 :原创 2013-09-24 13:33:32 · 2130 阅读 · 0 评论 -
决策树算法的实现
我拜读了yangliuy的博客,他用c++实现了决策树算法。我用一天时间仔细阅读了他的代码,确实很好。并且在他代码的基础之上添加了一些注释,便于自己理解。转载自:http://blog.csdn.net/yangliuy/article/details/7322015#include #include #include #include #include #include转载 2013-10-24 15:32:18 · 1340 阅读 · 0 评论 -
归并排序(merge sort)的实现
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个原创 2013-06-07 16:02:57 · 3363 阅读 · 0 评论 -
算法导论-单源最短路径-Dijkstra算法的实现
public class Dijkstra { static int M=10000; public static void main(String[] args) { // TODO Auto-generated method stub int[][] weight1 = { {0,3,2000,7,M},原创 2014-03-27 10:09:04 · 1379 阅读 · 0 评论 -
算法导论-分治法-最近点对-HDOJ1007
HDOJ1007的原题目是求出在不同时套中两个玩具的前提下,圆圈的最大半径。问题翻译过来就是求解最近点对的问题,这个问题是经典的分治法问题。参考博客:http://www.cnblogs.com/peng-come-on/archive/2012/01/18/2325163.html毫无疑问,通过暴力手段列举所有的点对并计算这些点对的距离,找出最小的一组,可以得到最后的结果。但是,这道题的原创 2014-03-20 10:38:51 · 5574 阅读 · 6 评论 -
算法导论-最小生成树-prim算法
关于最小生成树的prim算法原理这里不多做介绍了。与kruskal算法相比,都是利用了贪心策略来求最小生成树,不同的是:Kruskal算法中,集合A是一个森林;选择最小的权值边加入到森林。Prim算法中,集合A则是一棵树;每次加入到A中的安全边永远是连接A和A之外某个结点的边中权重最小的边。相当于树的生长。下面是Prim算法的代码,里面有详细的注释:#include#includ原创 2014-03-21 14:53:09 · 1418 阅读 · 0 评论 -
算法导论-用于不想交集合的数据结构(并查集)-kruskal最小生成树算法
并查集学习:并查集:(union-find sets)一种简单的用途广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数等。最完美的应用当属:实现Kruskar算法求最小生成树。并查集的精髓(即它的三种操作,结合实现代码模板进行理解):1、Make_Set(x) 把每一个元素初始化为一个集合转载 2014-03-20 21:29:38 · 1665 阅读 · 0 评论 -
汉字统计-汉字内码-HDOJ2030
汉字机内码在计算机的表达方式的描述是,使用二个字节,汉字的每个字节都是计算机中,补码第一位是符号位,1表示为负数,所以汉字机内码的每个字节表示的十进制数都是负数。这题正如提示的那样,从汉字机内码的特点考虑,很显然我们都知道,一个汉字占两个字节,但由于我们对汉字在ASCII不太了解,可能这题不好做,但是其实很好做,在ASCII中有128中字母,都有了各自的相应的数字对应,这么说来在汉字一定是原创 2014-03-21 22:29:47 · 1225 阅读 · 0 评论 -
算法导论-递推公式-HDOJ2041
Problem Description有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法? Input输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1 Output对于每个测试实例,请输出不同走法的数量 Sample Input2原创 2014-03-22 20:18:25 · 1442 阅读 · 0 评论 -
进制转换-HDOJ2031
Problem Description输入一个十进制数N,将它转换成R进制数输出。Input输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(210)。Output为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。Sample Input7 2 23 12 -4 3S原创 2014-03-21 23:55:58 · 956 阅读 · 0 评论 -
大数乘法-HDOJ1042
这道题目把我难住了,用普通的算法通不过。查了资料才知道,这道题目属于大数相乘的问题。思路和大整数的加法类似,利用乘法的原理解题,用整数数组来解决大数的存储问题。(因为用整型类型来存储大数会发生溢出。)所谓的乘法原理:是指两个数相乘,其结果等于一个数与另一个数的每一位上的数字相乘后所得到的数字之和。跟我们笔算两个数的乘法是一样的。例如:125*12 = 5*12+20*12+100*12原创 2014-03-26 13:38:13 · 1215 阅读 · 0 评论 -
不可摸数-HDOJ1999
Problem Descriptions(n)是正整数n的真因子之和,即小于n且整除n的因子和.例如s(12)=1+2+3+4+6=16.如果任何数m,s(m)都不等于n,则称n为不可摸数. Input包含多组数据,首先输入T,表示有T组数据.每组数据1行给出n(2 Output如果n是不可摸数,输出yes,否则输出no这原创 2014-03-26 16:41:43 · 1085 阅读 · 0 评论 -
矩阵求和-HDOJ2156
Problem Description我们定义如下矩阵:1/1 1/2 1/31/2 1/1 1/21/3 1/2 1/1矩阵对角线上的元素始终是1/1,对角线两边分数的分母逐个递增。请求出这个矩阵的总和。 Input每行给定整数N (N Output输出答案,保留2位小数。这道题目我用数学归纳法做出来了,原创 2014-03-26 18:55:38 · 1319 阅读 · 0 评论 -
常用插值算法介绍(一)
图像的缩放很好理解,就是图像的放大和缩小。传统的绘画工具中,有一种叫做“放大尺”的绘画工具,画家常用它来放大图画。当然,在计算机上,我们不再需要用放大尺去放大或缩小图像了,把这个工作交给程序来完成就可以了。下面就来讲讲计算机怎么来放大缩小图象;在本文中,我们所说的图像都是指点阵图,也就是用一个像素矩阵来描述图像的方法,对于另一种图像:用函数来描述图像的矢量图,不在本文讨论之列。越是简单的模型越原创 2013-09-21 16:47:22 · 7711 阅读 · 0 评论 -
寻找某个大数的最大质数
# -*- coding: utf-8 -*-#寻找某个大数的最大质数# 判断是否为质数,是质数返回1,否则返回0def is_prime(num): limit = int(pow(num, 0.5)) i = 2 while 1: if num % i == 0 or i > limit: break i原创 2013-10-02 21:25:55 · 1959 阅读 · 0 评论 -
分支限界法与回溯法
(1)求解目标:回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。(2)搜索方式的不同:回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。在分支限界法中,每一个原创 2013-06-08 23:05:53 · 2080 阅读 · 0 评论 -
projecteuler Problem 20
n! means n (n 1) ... 3 2 1For example, 10! = 10 9 ... 3 2 1 = 3628800,and the sum of the digits in the number 10! is 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27.Find the sum of the digits原创 2013-03-22 20:05:20 · 745 阅读 · 0 评论 -
判断给定的整数是否是2的幂
答案:(b&(b-1))==0原创 2013-04-07 17:10:35 · 996 阅读 · 0 评论 -
projecteuler Problem 29
def Judge(small,big): lsum=[] num=0 for i in range(small,big+1): for j in range(small,big+1): num=i**j if(lsum.count(num)==0): lsum.append(n原创 2013-03-24 16:23:05 · 575 阅读 · 0 评论 -
project euler Problem 25
i=1j=1count=2while(True): count=count+1 temp=i+j i=j j=temp L=list(str(temp)) if(len(L)>=1000): print count break原创 2013-03-24 16:39:53 · 635 阅读 · 0 评论 -
project euler Problem 34
def JieCheng(n): sum=1 for i in range(2,n+1): sum=sum*i return sumdef Judge(n): s=str(n) sum=0 for i in s: sum+=JieCheng(int(i)) if(sum==n): retur原创 2013-03-24 17:01:56 · 719 阅读 · 0 评论 -
project euler Problem 36
def Judge(n): bstr=bin(n) bstr=bstr[2:] ostr=str(n) flag1=True flag2=True for i in range(len(bstr)): if bstr[i]!=bstr[len(bstr)-i-1]: flag1=False原创 2013-03-24 17:37:22 · 594 阅读 · 0 评论 -
分治法的基本思想
分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立与原问题相同。递归地解这些子问题,然后将各子问题的解合并得到原问题的解。用分治法设计出的程序一般是递归算法。原创 2013-05-22 09:44:36 · 2279 阅读 · 0 评论 -
Hanoi塔
//将a塔移动到b塔上void hanoi(int n,int a,int b,int c){ if(n>0) { hanoi(n-1,a,c,b); move(a,b); hanoi(n-1,c,b,a); }}hanoi塔的递归算法。要将塔从a移动到b上,首先将前n-1个盘移动到c上,再将a塔剩下的一个移动到b上,最后将c塔上的n-1个盘移动到b塔上。原创 2013-05-20 08:38:39 · 1025 阅读 · 0 评论 -
递归和分治
直接或间接地调用自身的算法称为递归算法。用函数自身给出定义的函数称为递归函数。由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。优点:结构清晰原创 2013-06-08 13:23:18 · 733 阅读 · 0 评论 -
活动安排问题(贪心算法)
设有n个活动的集合E={1,2,...,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si=fi或sj>=fi时,活动i与活动j相容。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合。在下面所给出的解活动安排问题的贪心算法GreedySelector中,各活动的起始时原创 2013-06-08 19:34:54 · 3018 阅读 · 0 评论 -
数组的全排列
#include using namespace std;templateinline void Swap(Type &a, Type &b){ Type temp=a; a=b; b=temp;}template /*算法Perm(list,k,m)递归地产生所有前缀是list[0:k-1],且后缀是list[k:m]的全排列的所有排列。全排列从k位原创 2013-06-12 13:35:48 · 712 阅读 · 0 评论 -
问题求解过程
原创 2013-06-12 13:37:26 · 663 阅读 · 0 评论 -
算法与程序的区别
算法是指解决问题的一种方法或一个过程。算法是若干指令的有穷序列,满足性质:(1)输入:由外部提供的量作为算法的输入。(2)输出:算法产生至少一个量作为输出。(3)确定性:组成算法的每条指令是清晰,无歧义的。(4)有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的。程序是算法用某种程序设计语言的具体实现。程序可以不满足算法的性质(4)。例如操作原创 2013-06-08 10:24:54 · 12285 阅读 · 0 评论 -
顺序搜索算法
#include using namespace std;//顺序搜索算法templateint seqSearch(Type *a, int n, Type k){ for(int i=0;i<n;i++) if (a[i]==k) return i; return -1;}int main(){ int a[]={4,3,2,1,5,6原创 2013-06-08 10:55:13 · 733 阅读 · 0 评论 -
单源最短路径(Dijkstra算法,贪心算法的应用)
Dijkstra算法与Prim算法(一种构造最小生成树算法)类似,都是一个源,慢慢发散。Kruskal算法(另一种构造最小生成树算法)多个源,分别发散,最后连接在一起。原创 2013-06-08 22:25:26 · 879 阅读 · 0 评论 -
背包问题
背包问题:异宝n件,该背包只可承重W kg。每件珍宝都有重量wi和价值pi。解:按照pi/wi 比率对珍宝进行排序,形成pi/wi 大于 p i+1/w i+1。KNAPSACK (p, w, W)load = 0;i = 1;while (load<W && i<=n){ if(wi <= W-load) { take item i;原创 2013-06-08 15:32:41 · 523 阅读 · 0 评论 -
名字的漂亮度
描述: 给出一个名字,该名字有26个字符串组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个字母拥有相同的“漂亮度”。字母忽略大小写。给出多个名字,计算每个名字最大可能的“漂亮度”。 题目类别: 字符串 难度: 初级 运行时间限制:原创 2014-12-21 12:44:57 · 1460 阅读 · 0 评论