编程珠矶
文章平均质量分 70
lonelycatcher
爱谷歌,爱豆瓣,爱python
展开
-
n 元一维向量旋转问题(编程珠机) 第二章问题B
/* * method No_1 * using a temp to store x[0],then x[0] = x[i] ,x[i] = x[2i] ......until ki>=n,then x[(k-1)i] = x[0] * then dealing with x[1],x[2] ........x[i-1] */int gcd(int x ,int y){ if(x=原创 2012-07-12 14:48:59 · 3053 阅读 · 0 评论 -
编程珠玑 第九章 第7题 获取一个字节序列中1的个数
首先对于每一个字节中,获取这个字节中1的个数,当然,不能将这个unsiged char 值转换成二进制数,然后再去统计1的个数,这种方法效率相当低下,这样就会想到位运算,位运算的一种好方法是利用 x &=x-1的方法,进行多少次计算,就有多少个1,然后对于一个字节,将每一个数(0-255)的1的个数存进一个数组,这样以后每取出一个字节,可以直接找到这个字节1个数。int get_count(u原创 2012-07-31 10:36:58 · 676 阅读 · 0 评论 -
编程珠矶 4.6 习题 2 二分搜索第一次出现的key
这个应该是很简单的了,我们每次查找mid的时候,如果a[mid] == key , 并且 left == right, 则这个index 就是要求的下标, 如果left != right ,则令right = mid ,正常的搜索,这里应该直接返回,因为要求的是第一次出现的下标,所以第一次出现的或者为此时mid的位置,或者为Mid往左的位置,这也就是为什么只有档left == right 时才能返原创 2012-07-14 12:10:08 · 644 阅读 · 0 评论 -
编程珠矶 第八章 第10题 寻找最接近0和t的子向量
关于找出总和最接近0的子向量,课后习题解答已经给出了解决方案,时间复杂度为O(nlgn), 这道题目不能用dp解决的原因是:总的最优并不能通过最优子结构来获得,举个例子向量 -9 -8 -7 -6 -5 -4 -3 -2 -1 45, 到-1的时候,最优解为 -1,但是通过-1并不能获得下一个元素的最优解,很显然,当值为45时,最优解为0,全部元素相加,但是并不能通过前面元素最优解 -1 得原创 2012-07-28 18:55:56 · 1427 阅读 · 0 评论 -
编程珠矶 第八章 第十三题 子矩阵最大和
参考:http://acm.hdu.edu.cn/showproblem.php?pid=1081#include#include#include#define NUM 110int get_max(int x,int y){ return x>y?x:y;}intmain(void){ int N; int list[NUM][NUM]; while(sca原创 2012-07-29 11:33:22 · 1255 阅读 · 0 评论 -
编程珠矶 第八章 第9题
很简单,只要当前sum>0时候就把x[i]加上,sum[i]#include#include#include#define GET_MAX(x,y) ((x)>(y)?(x):(y))#define MAX_NUM 10000int list[MAX_NUM];/* *method 1 divide and conquer */int get_max_sum(int *原创 2012-07-28 10:30:59 · 539 阅读 · 0 评论 -
编程珠矶 第八章 第四题
这道题目个人认为应该用随机算法多次模拟最后求平均这样的方法来做,这里面有两个问题,一个是模拟的数组应该是开多大,而是测试用例要弄多少次,测试用例的次数当然是越多越好,而数组里面元素的个数直接影响最后的期望值,大概1个元素期望是0--1的期望,然后期望和元素个数应该是个线性的关系。如果我的程序有什么错误之处,还请大家赐教!#include#include#include#include#in原创 2012-07-28 09:27:32 · 621 阅读 · 0 评论 -
c 语言实现全排列和组合
求全排列的话有两种方法:方法一:利用递归,将一个排列看成是以一个数开头+另外一个子排列, 例如数组list[n]的全排列,以list[i]表示以元素list[i]开头的一个排列,所以所有的排列数为list[0]+list[1]+list[2].......list[n-1], 以list[i]为首元素的排列可以看成是list[i] 为首,加上另外n-1个元素排列的排列。这里每次以lis原创 2012-08-06 15:32:45 · 1720 阅读 · 0 评论 -
编程珠矶 第十三章 位图的实现
位图就是用一个比特位去表示一个整数,该位为1,表示此数存在,该为为0,表示此数不存在。使用位图会节省空间,并且查询,插入操作都是O(1)的,效率极高,当然,如果你设置map的类型为unsigned char *,也是可以的,只不过这时候SHIFT = 3, MASK = 0x7#include#includeusing namespace std;#define BITSPER原创 2012-08-06 21:16:49 · 983 阅读 · 0 评论 -
编程珠玑第十二章 生成有序随机序列
编程珠玑第十二章的主题是给定0-n-1共n个数,生成m(m方法一:最容易想到的就是利用C++中的set容器,不断向set中插入rand()%n的数,直到set的size为M,break即可,set容器会自动将元素排序方法二:是书上给的解法,扫描数组[0,n),然后令remaining = n,select = m,每次成功选择一个数i,则select -1,每次循环remaining--;原创 2012-08-06 10:39:38 · 1311 阅读 · 0 评论 -
编程珠玑 第十一章 第一题 找中位数
第一题求最小值、最大值和均值显然不用排序,只需要扫描一遍数组即可。关于中值,换个思路思考,就是找排好序的数组中的index为N/2的数,所以方法出来了方法一:先对数组进行排序,然后直接得到arr[N/2]即为索求的中位数,时间复杂度为O(nlgn),在这里面如果调用库函数qsort的花费的时间会比自己去写一个排序函数花费更多的时间,qsort最好情况为O(nlgn),所以可以用其他一些严格O(原创 2012-08-03 12:40:10 · 1724 阅读 · 0 评论 -
编程珠玑 第十一章 第9题 从数组中找出第K小的数
求中位数那题是知道题的特例,求第K小的数,利用快排的划分思想,时间复杂度O(N+N/2+N/4....) = O(N)void swap(int *a,int *b){ int temp = *a; *a = *b; *b = temp;}void qselect(int *list,int left ,int right, int K) // index is K,not th原创 2012-08-03 14:54:28 · 1244 阅读 · 0 评论 -
编程珠玑 第十一章 第 六题 选择排序和希尔排序
选择排序很简单,就是每次从i--N的位置找出最小(最大)的元素放在i处,时间复杂度O(N^2)希尔排序是插入排序的变形,插入排序就是从第二个元素开始,第i个元素前面的自序列已经是有序的,只要将i元素插入到0-i适当的位置即可,最好情况下是元素list[i]>list[i-1],即不需要移动,最好情况下是数组本来有序,时间复杂度O(N). 希尔排序就是插入排序的增亮模型,通过设置增量减少元素的移原创 2012-08-03 14:26:15 · 517 阅读 · 0 评论 -
编程珠矶 习题 4.6 利用二分搜索找到一个数在顺序数组里面的下限和上限
很显然,这道题目用二分搜索去解答,关键是怎么样去找这个上限点和下限点,方法很简单,每次去mid, 如果aa[mid] 比key要大的话,那么mid 是key的一个上限,但不一定是最小上限,同理。。。那么不断二分,不断逼近,最后即可求得解void search_between(int arr[], int n_size, int *up, int *down,int key){ int left原创 2012-07-14 15:41:59 · 675 阅读 · 0 评论 -
编程珠玑 第九章 第六题 (isdigit \ isupper\islower)的实现
这个实现主要有两种方法,一种是利用宏定义,一种是利用HASH表,宏定义需要判断,其实效率都差不多,HASH主要是利用了位运算#include#include/* *method No_1, macro definition */#define isdigit(x) ((x)>='0' && (x)<='9')#define isupper(x) ((x)>='A' && (x)原创 2012-07-31 10:00:39 · 795 阅读 · 0 评论