
algorithms
文章平均质量分 79
atomic_age
这个作者很懒,什么都没留下…
展开
-
全排列
递归算法 全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个。现以{1, 2, 3, 4, 5}为例说明如何编写全排列的递归算法。1、首先看最后两个数4, 5。 它们的全排列为4 5和5 4, 即以4开头的5的全排列和以5开头的4的全排列。由于一个数的全排列就是其本身,从而得到以上结果。2、再看后三个数3, 4, 5。它们的全排列为3 4 5、3 5 4、原创 2006-04-13 16:18:00 · 2687 阅读 · 1 评论 -
李开复:算法的力量
李开复:算法的力量 算法是计算机科学领域最重要的基石之一,但却受到了国内一些程序员的冷落。许多学生看到一些公司在招聘时要求的编程语言五花八门就产生了一种误解,认为学 计算机就是学各种编程语言,或者认为,学习最新的语言、技术、标准就是最好的铺路方法。其实大家都被这些公司误导了。编程语言虽然该学,但是学习计算机算 法和理论更重要,因为计算机算法和理论更重要,因为计算机语言和开发平台日新月异,但万变不转载 2006-07-29 15:10:00 · 1161 阅读 · 1 评论 -
百度面试题的java实现
有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。java实现代码public class test原创 2006-11-10 10:40:00 · 1129 阅读 · 0 评论 -
百度之星程序设计大赛初题目
1.百度语言翻译机 百度的工程师们是非常注重效率的,在长期的开发与测试过程中,他们逐渐创造了一套独特的缩略语。他们在平时的交谈、会议,甚至在各种技术文档中都会大量运用。为了让新员工可以更快地适应百度的文化,更好地阅读公司的技术文档,人力资源部决定开发一套专用的翻译系统,把相关文档中的缩略语和专有名词翻译成日常语言。输入要求:输入数据包含三部分:1. 第一行包含一个整数N(N2. 紧接着有N转载 2006-06-05 19:57:00 · 1579 阅读 · 0 评论 -
归并排序(merge sort)
归并排序(merge sort)体现了分治的思想,即将一个待排序数组分为两部分,对这两个部分进行归并排序,排序后,再对两个已经排序好的数组进行合并。这种思想可以用递归方式很容易实现。归并排序的时间复杂度为O(nlogn),空间复杂度为O(n)。实现代码如下:#include #include "common.h" void merge(int data[], int原创 2006-05-10 09:11:00 · 10667 阅读 · 3 评论 -
选择排序(selection sort)
从字面上理解,就是通过不断地选择数组元素,从而达到排序的目的。我插入排序类似,假设第i(i算法的时间复杂度为O(n^2)。算法的实现如下#include void output_array(int data[], int n){ int i; for(i = 0; i printf("%d ", data[i]); printf("/n");}void s原创 2006-05-05 11:32:00 · 2232 阅读 · 0 评论 -
快速排序(quicksort)
快速排序(quicksort)是分治法的典型例子,它的主要思想是将一个待排序的数组以数组的某一个元素X为轴,使这个轴的左侧元素都比X大,而右侧元素都比X小(从大到小排序)。然后以这个X在变换后数组的位置i分为左右两个子数组,再分别进行快速排序,直到子数组中只有一个元素为止。快速排序算法如下void quicksort(int A[], int p, int r){ int i;原创 2006-05-06 10:37:00 · 4101 阅读 · 0 评论 -
插入排序(insertion sort)
插入排序算法的原理很简单,首先将数组的第一个数data[0]看成是有序的,然后从第二个元素开始和它前面的元素进行比较,如果从前面的某一个数大,就交换。由于前面的元素是有序的,所以就使有序元素的个数逐渐增大,直到等于n。插入排序的时间复杂度为O(n^2)。算法的c实现如下:#include void output_array(int data[], int n){ int i;原创 2006-05-05 11:19:00 · 2602 阅读 · 0 评论 -
冒泡排序(bubble sort)
冒泡排序是最基本的排序算法,常被做为内部排序的第一个排序算法进行讲解。它的原理非常简单,只是一个两层循环,每次将最大或最小的放到数组最后。算法如下(b为数组的起始位置, e为数组的结果位置):int bubble(int data[], int b, int e){ int i, j, n = 0; for(i = e; i > b; i--) for(j = b; j原创 2006-05-02 14:46:00 · 4678 阅读 · 0 评论 -
得到第K个大的数
第K个大的数就是一个排序数组的第K个数 第一种算法是最容易想到的,就是利用快速排序的思想,将一个数组分成以某一个数X为轴,左边的所有的数都比X小,而右边的数都比X大。但我快速排序不同的是,在这个算法中只考虑X的一边,而不是两边都考虑。 如果X的位置是i,那么要得到第k个数,如果k源码如下:#include #include int new_random(int min, int原创 2006-04-26 17:07:00 · 1174 阅读 · 1 评论 -
拆半查找的递归和非递归算法
#include int binary_search(int x, int data[], int b, int e) { int i; while(b { i = (b + e) / 2; if(data[i] == x) return i; if(data[i] b原创 2006-04-19 09:57:00 · 1027 阅读 · 0 评论 -
棋盘覆盖问题
在一个2^k * 2^k个方格组成的棋盘中,有一个方格与其它的不同,若使用以下四种L型骨牌覆盖除这个特殊方格的其它方格,如何覆盖。四各L型骨牌如下图1 图1棋盘中的特殊方格如图2 图2 实现的基本原理是将2^k * 2^k的棋盘分成四块2^(k - 1) * 2^(k - 1)的子棋盘,特殊方格一定在其中的一个子棋盘中,如原创 2006-04-23 11:24:00 · 1918 阅读 · 0 评论 -
整数划分
整数划分 整数划分问题是将一个正整数n拆成一组数连加并等于n的形式,且这组数中的最大加数不大于n。 如6的整数划分为 6 5 + 1 4 + 2, 4 + 1 + 1 3 + 3, 3 + 2 + 1, 3 + 1 + 1 + 1 2 + 2 + 2, 2 + 2 + 1 + 1, 2 + 1 + 1 + 1 + 1 1原创 2006-04-16 19:01:00 · 1587 阅读 · 0 评论 -
《程序员》第9期智慧擂台题目——高频词汇提取
面对浩瀚的信息海洋,找到想要的资源有时真的是不容易。在大量文字中搜索高频词汇是信息搜索和数据压缩的共通课题。 这次智慧擂台请大家在一个比较庞大的英文文本中找出M个数量最多的短语(由N个单词组成)。统一处理相同的文本文件,该文本只包含英文单词、空格和回行符,比较谁的程序效率最高,这个文本近日发布。 程序输入:M,N,文本文件路径(M不超过20,N不超过8) 程序输出:高频短语及其数量清单原创 2006-08-23 14:09:00 · 1124 阅读 · 0 评论 -
一著名软件公司的java笔试算法题的答案
原题如下:用1、2、2、3、4、5这六个数字,用java写一个程序,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。 解题思路: 很明显,这是一个递归算法。我们可以排列将这6个数按从小到大的顺序排一下,如果是1,2,3,4,5,6,那么会有1*2*3*4*5*6=6!=720个递增的数。但如果是1,2,2,3,4,5,那么在这72原创 2007-02-24 12:26:00 · 1452 阅读 · 0 评论