
算法设计
文章平均质量分 74
csc_csc_csc
这个作者很懒,什么都没留下…
展开
-
数组中寻找第K小的数----位图法(bitmap)
(1)位图法 所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的(百度百科)。 例如:对{0, 1, 5,3, 7}进行排序,可以在计算机中使用8位表示这几个数,也就是使用一个字节空间可以完成排序。 数组中的数: 0 1 3原创 2012-10-15 19:25:13 · 3489 阅读 · 1 评论 -
搬水果 (贪心算法实现)
(1)题目描述: 在一个果园里,小明已经将所有的水果打了下来,并按水果的不同种类分成了若干堆,小明决定把所有的水果合成一堆。每一次合并,小明可以把两堆水果合并到一起,消耗的体力等于两堆水果的重量之和。当然经过 n‐1 次合并之后,就变成一堆了。小明在合并水果时总共消耗的体力等于每次合并所耗体力之和。 假定每个水果重量都为 1,并且已知水果的种类数和每种水果的数目,你的任务是原创 2012-11-01 23:17:38 · 3784 阅读 · 0 评论 -
检测是否为连通图(深度优先遍历算法)
(一)九度上一个练习题题目描述: 给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的。输入: 每组数据的第一行是两个整数 n 和 m(0输出: 对于每组输入数据,如果所有顶点都是连通的,输出"YES",否则输出"NO"。样例输入: 4 31 22 33 23 21 22 30 0样例输出:原创 2012-11-04 22:19:04 · 14969 阅读 · 0 评论 -
Dijkstra算法实现
(1)Dijkstra算法解决了有向图上带权的单元最短路径问题,但是算法要求所有的权值必须是非负。算法的思想及其实现均参考《算法导论》一书。 Dijkstra算法的时间复杂度依赖于最小优先队列的具体实现,下述算法采用的是最小堆结构,时间复杂度为O((V+E)lgV)(2)算法实现:(简单案例测试成功,若存在问题请指出,多谢。)#include using原创 2012-11-26 21:06:10 · 3667 阅读 · 1 评论 -
Bellman—Ford算法实现(解决存在负边情况下单源最短路径问题)
(1)BellmanFord算法能够在存在负边权值的情况下,解决单源最短路径问题,其时间复杂度为O(VE)。 算法实验思想以及算法正确性分析主要参考《算法导论》中单源最短路径一章。 (2)代码中图的实现采用邻接表,图的节点编号从0开始计数。算法输入图的结构,输出从源点到各个节点的最短距离#include #include u原创 2012-11-26 17:00:29 · 2308 阅读 · 0 评论 -
Stable Matching Problem稳定匹配问题-----稳定婚姻算法
(一)问题的引出: 有N男N女,每个人都按照他对异性的喜欢程度排名。现在需要写出一个算法安排这N个男的、N个女的结婚,要求两个人的婚姻应该是稳定的。 何为稳定? 有两对夫妻M1 F2,M2 F1。M1心目中更喜欢F1,但是他和F2结婚了,M2心目中更喜欢F2,但是命运却让他和F1结婚了,显然这样的婚姻是不稳定的,随时都可原创 2012-12-13 16:15:52 · 39290 阅读 · 4 评论 -
哈夫曼树
(1)九度上的练习题,通过这个练习题把哈夫曼树复习一遍,并编码实现:题目描述: 哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和。输入: 输入有多组数据。每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2输出: 输出权原创 2013-01-08 20:22:11 · 1252 阅读 · 0 评论 -
斐波那契数列
(1)题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。斐波那契数列的定义如下:输入:输入可能包含多个测试样例,对于每个测试案例,输入包括一个整数n(1输出:对应每个测试案例,输出第n项斐波那契数列的值。(2)这是九度上的一个题,要求时间限制1秒,整数的范围是大于0,小于70。如果是直接从n递归到原创 2013-02-28 09:39:34 · 2568 阅读 · 0 评论 -
二叉树遍历(九度题)
(1)题目描述:编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。例如如下的先序遍历字符串:ABC##DE#G##F###其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。输入:输入包括1行字符串,长度不超过100。输出:可能有多组测试原创 2013-02-28 09:49:32 · 2147 阅读 · 0 评论 -
KMP算法实现
(1)KMP算法 KMP算法是一种字符串匹配算法。学习这种字符串匹配算法最好是以例子的形式理解其思想。推荐一个用图片说明算法过程的博客,浅显易懂: http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html(2)算法实现#in原创 2013-05-29 10:34:03 · 1711 阅读 · 0 评论 -
二叉树遍历---已知前序遍历和中序遍历求其后序
(1)九度上一个关于二叉树遍历的问题。通过给定的前序遍历与中序遍历就可以确定二叉树的结构。题目描述: 二叉树的前序、中序、后序遍历的定义:前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树;中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树;后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。给定一棵二叉树的前序遍历和原创 2012-10-17 10:30:04 · 9548 阅读 · 1 评论 -
有多少不同的面值组合
(1)题目要求题目描述:某人有8角的邮票5张,1元的邮票4张,1元8角的邮票6张,用这些邮票中的一张或若干张可以得到多少种不同的邮资?输入: 题目没有任何输入输出: 按题目的要求输出可以得到的不同邮资的数目(2)分析这个题目,可以将其归结为数组去重的问题。可以使用计数排序来实现。 题目中总共的面值为 8*5+10*4+原创 2012-10-16 17:50:37 · 2178 阅读 · 0 评论 -
归并排序算法实现(C++)
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作[1]。下面是百度百科上的一个例子: 如 设有数列{6,202,100,301,38,8,1} 初始状态: [6] [202] [100] [301] [38] [8] [1] 比较次数 i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ] 3 i=2 [原创 2012-03-26 11:03:27 · 1921 阅读 · 0 评论 -
快速排序算法实现(C++)
快速排序采用的是分治法,其平均时间复杂度为O(nlogn)一趟快速排序的算法是[1]: 1)设置两个变量I、J,排序开始的时候:I=0,J=N-1; 2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0]; 3)从J开始向前搜索,即由后开始向前搜索(J=J-1即J--),找到第一个小于key的值A[j],A[j]与A[i]交换;原创 2012-03-26 22:34:10 · 26392 阅读 · 1 评论 -
希尔排序算法实现(C++)
希尔排序是一种按照增量排序的方法。其中增量值是小于n的正整数。 shell排序的基本思想[1]是: 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2可以根据百度百科中提供的图来直观的看一下:(1)初始增量为3,该数组分为三组分别进行排序。(初始增量值原创 2012-03-25 21:51:19 · 29803 阅读 · 4 评论 -
堆排序算法实现(C++)
/* * main.cpp * * Created on: 2012-3-16 * Author: csc */#include using namespace std;int a[] = {49,38,65,97,76,13,27,50};void FixTree(int a[], int i){ cout<<"i: "<<i<<endl;原创 2012-04-17 15:47:56 · 1293 阅读 · 0 评论 -
计数排序Java实现
计数排序的下界优于任意一个比较排序算法。它是一个不需要比较两个元素大小的排序算法。计数排序在百度百科中有详细的介绍http://baike.baidu.com/view/1209480.htm。这里编写了计数排序的Java版本: public static void main(String args[]) { int[] a = new int[] { 2,5,3,0,2,3,0原创 2012-09-04 20:54:05 · 2604 阅读 · 0 评论 -
选择排序算法实现(Java)
选择排序的算法描述:首先找出数组A中的最小元素,然后将其与A[0]中的元素进行交换,然后找出A中次小的元素,与A[1]中的元素进行交换.......以此类推。下面是Java版的简单算法实现:public class S_Sort{ public static void main(String args[]) { int[] a = new int[]{11,2原创 2012-08-29 14:57:50 · 859 阅读 · 0 评论 -
最长公共子序列算法(LCS)
(1)最长公共子序列问题可以使用动态规划来有效的解决。(2)算法实现是参考《算法导论》中的动态规划一章 public static void main(String args[]) { String s1= "abcbdab"; String s2 = "bdcaba"; LCS.getLCSLength(s1, s2); } publ原创 2012-09-18 16:41:11 · 5405 阅读 · 0 评论 -
编辑距离算法实现
(1)编辑距离是测量一个字符串转换成另外一个字符串需要操作(操作包括: 插入 删除 置换)的最小次数。 编辑距离可以用来计算两字符串的相似度,另外也可以通过余弦方法来计算两字符串的相似度(2)算法实现采用动态规划算法,其求解过程类似于求两字符串的最长公共序列(LCS) 下面是算法实现: public class原创 2012-09-18 18:29:41 · 4050 阅读 · 0 评论 -
寻找大富翁(Top k问题)
(1)寻找大富翁问题。题目描述: 浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁.输入: 输入包含多组测试用例. 每个用例首先包含2个整数n(0 n和m同时为0时表示输入结束.输出: 请输出乌镇前m个大富翁的财产数,财产多的排前面,如果大富翁不足m个,则全部输出,每组输出占一行.这其实是一个Top原创 2012-10-13 00:31:55 · 2814 阅读 · 0 评论 -
余弦方法计算相似度算法实现
(1)余弦相似性 通过测量两个向量之间的角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。所以,它通常用于文件比较。 详见百科介绍(点击打开链接)(2)算法实现的中未使用权重(IDF ---逆文档频率),使用词项的出现次数原创 2012-09-18 10:22:44 · 32079 阅读 · 0 评论