摘要: 本章主要讨论如何节省程序所占用的空间(包括数据空间和代码空间),用现在的观点来看,后面的一些做法有时为了节省空间确实有点“无所不用其极”.1.考虑这样一个矩阵存储的问题 假设有一个200*200的稀疏矩阵(总共40000个元素),大约只有2000个点是有值的,其余元素认为是0,怎样以最小的空间代价来存储该数组呢? 以下假设整数采用16位。 (1)使用普通的200*200的数组,就需要 40000*2 = 80KB的内存空间。 (2)使用一个数组表示给定的列,然后使用链表来表示给定列中的非0元素。 从上图中看出,第一列3个点,第二列2个点,第三列没有,....... 对于点(i,j)... 阅读全文
posted @ 2012-09-07 13:37 dandingyy 阅读(439) 评论(0) 推荐(0) 编辑
摘要: 第9章主要对已经写好的代码进行局部优化,这里已经不再涉及算法实现方面。1.首先是对一个C程序进行性能监视,来找到我们是在哪个函数或哪个部分花费了较多时间。 书上说的进行监视的代码实际上是“第13章,使用 箱结构进行搜索”的一个实现。具体代码如下: 1 /* Copyright (C) 1999 Lucent Technologies */ 2 /* From 'Programming Pearls' by Jon Bentley */ 3 4 /* genbins.c -- generate random numbers with bins */ 5 //这里去掉了bigran 阅读全文
posted @ 2012-09-07 13:30 dandingyy 阅读(783) 评论(0) 推荐(0) 编辑
摘要: 本章主要为了说明——一个良好的算法设计不仅能让程序更简单(第二章),更能提高程序的性能。1.问题:连续子序列最大和问题 具体描述:在一串可正可负的n个整数向量中,给出连续子序列的最大和。 如给出{-2, 11, -4, 13, -5, -2}. 输出应为 20,(也就是 11, -4, 13这三个子序列)2.解法 这个问题因为见过较多,四种解法也都看过,就当是复习吧: 方法1:O(n^3),基本遍历方法,遍历每一个子数组,计算其和并比较。 1 int method1(vector<int> data) 2 { 3 int len = data.size(); 4 int... 阅读全文
posted @ 2012-09-06 16:01 dandingyy 阅读(322) 评论(0) 推荐(0) 编辑
摘要: (先只记下我最常用的,以后随时补充)1.栈跟踪:backtrace用于查看程序经过哪些函数到达该断点:(gdb) backtrace#0 IntSetArray::IntSetArray (this=0xbfffefac, n=5, v=100) at set.cpp:53#1 0x08048ad6 in generate (numbers=5, maxValue=100) at set.cpp:339#2 0x08048d7d in main (argc=3, argv=0xbffff0b4) at set.cpp:3702查看变量: print i //后面,i可以是任意语法的变... 阅读全文
posted @ 2012-09-05 23:06 dandingyy 阅读(203) 评论(0) 推荐(0) 编辑
摘要: 前5章涵盖了编写一个程序解决问题的全部过程,接下来几章都是从程序性能入手,描述程序效率。1.计算机系统的设计层面 问题定义:分析问题,确定已知信息和最终目标; 系统结构:将问题分解为模块; 算法和数据结构:对相应模块选择合适算法; 代码调优:某些算法实现上进行局部改进; 系统软件:考虑我们解决问题的平台;(是否需要并行等) 硬件:选择更好的硬件。2.原理总结 当程序性能问题无法回避时, 如果仅需要较小加速,只在最佳层面上改进; 如果需要较大加速,对多个层面改进。第7章 粗略估计(没有细看。。。)1.基本技巧:多种方法估计,比较结果;快速检验;经验法则;实践2.性能估计:存储空... 阅读全文
posted @ 2012-09-01 22:52 dandingyy 阅读(260) 评论(0) 推荐(0) 编辑
摘要: 这部分接第四章,讲述对前面的代码进行测试。 这里一直提到名词 脚手架(scaffolding),可以理解为访问目标函数的主函数,用于对目标函数的测试。 待测试的函数是上一篇中提到的bsearch函数。1.测试工具 下面是一个调用bsearch的主函数 1 #include<iostream> 2 #include<fstream> 3 using namespace std; 4 5 #define MAX 50 6 8 int main(int argc, char**argv) 9 {10 ifstream fin(argv[1]);11 12 int A[M... 阅读全文
posted @ 2012-09-01 21:33 dandingyy 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 经过前三章,问题定义分析——算法设计——数据结构选择,这部分主要是编写正确的代码(包括伪代码)1.问题:二分搜索这部分一直都以二分搜索为核心进行讲述,自己写的函数如下:template<typename T>int bsearch(T *A, int l, int h, T obj){ if(l > h) return -1; int mid = (l+h)/2; if(A[mid] == obj) return mid; if(A[mid] > obj) return bsearch(A, l, mid-1, obj); ... 阅读全文
posted @ 2012-09-01 19:34 dandingyy 阅读(350) 评论(0) 推荐(0) 编辑
摘要: 这一章主要讨论良好的数据结构对程序的重要影响1.调查程序:问题的关键是决定怎样用数组来存储哪些数据。 格式信函编程:(更像是脚本程序所使用的形式) 对于一段应用较多的程序,只有个别变量与外界输入有关,可以将这些变量以特定的参数来表示,建立一个模板,然后使用特定的发生器来解释这个模板。如: 一个模板(schema)类似如下: Welcome back, $1! we hope you have fun in the holiday with $0 family.It will take $$120. your address: $2 $3 date: $4... 阅读全文
posted @ 2012-09-01 19:29 dandingyy 阅读(392) 评论(0) 推荐(0) 编辑
摘要: 这一章主要讨论算法设计这个主题。1.问题 A:给一个最多含有40亿(设为n)个随机排列的32位整数的顺序文件,找出一个不再文件中的数。(若具有足够内存?若只有几百字节的内存可用?) 首先,2^32 = 4294967296 > 40亿,所以一定缺失数。40亿个数字放入内存,每个四字节(unsigned int),需要(4*10^8)/(8*10^6) = 500MB. B: 将一个n元向量左旋转i个位置,如n=8,i=3,向量abcdefgh旋转为defghabc. C: 给定一个英语词典,找出所有变位词集合,变位词如pots, stop, tops为一组变位词。其中每个单词通过改变其. 阅读全文
posted @ 2012-09-01 19:23 dandingyy 阅读(553) 评论(0) 推荐(0) 编辑
摘要: 为了克服自己看过就忘的毛病,现在决定用文字把这些东西记录下来。以下大部分是对书上内容的总结。1.开篇第一部分主要是使用位图法进行排序。 问题描述:一个最多包含n个整数的文件,每个数小于m,n=10^7,数据不重复(所以m>=n),且随机出现。对该数据进行排序,最多有1MB的内存空间可用。2.首先分析问题,对n=10^7个数据,设每个int型为4字节,那么总共需要40MB的大小。所以如果要使用归并排序,需要进行40趟磁盘IO,这显然在时间上是难以忍受的。 考虑该问题的特点:1)数据大小范围有限;2)不重复。 针对第一个特点,计数排序是一个很好的方法,我们可以申请一个m大小的数组,用对应.. 阅读全文
posted @ 2012-08-27 22:56 dandingyy 阅读(534) 评论(0) 推荐(0) 编辑