07 2013 档案
摘要:前段时间开始自学数据库,学了一段时间下来,看了好几本书了,品味一下,有几本感觉对刚接触数据库(甚至是数据库高手)的兄弟们来说是相当不错的所以向大家推荐一下:
阅读全文
摘要:输入年、月、日、时、分、秒,输出下一秒的年、月、日、时、分、秒。
注意点:
加上输入合法性检查,在下面的代码中没有加;
注意闰年的情况;
阅读全文
摘要:面试宝典上的题目设计到而定东西很碎,很繁琐,不是针对数据结构与算法的考查,准备在两周内看完,并把一些自己美考虑到的记下来,方便日后复习。
阅读全文
摘要:最近要用到windows的telnet功能,本来是很简单的事情,因为管理员权限的问题,花了不少时间,才发现是管理员权限惹的祸,更滑稽的是,自己一直以来都不是管理员,是普通用户,想到之前安装软件时,也有类似的问题,当时也还是花了好大力气的,好多如果载管理员账号下登陆,就能很简单的解决了。
阅读全文
摘要:注意几点:
堆的性质虽然借助树的概念来定义的,但实际实现用数组即可,数组的下标可表征父节点与左右子树的关系;
数组下标从1开始时,下标为i的结点的左子树的下标为 2i,右子树下标为2i + 1;数组下标从0开始时,下标为i的结点的左子树的下标为 2i + 1,右子树下标为2i + 2;
注意循环结束条件;
下面的代码中输入数组是利用随机数产生函数rand()得到的,用srand()函数,可给rand()提供seed,这样每次运行时就会得到不同的随机数序列;但要注意其使用方法
阅读全文
摘要:管态又叫特权态,系统态或核心态。CPU在管态下可以执行指令系统的全集。通常,操作系统在管态下运行。
目态又叫常态或用户态。机器处于目态时,程序只能执行非特权指令。用户程序只能在目态下运行,如果用户程序在目态下执行特权指令,硬件将发生中断,由操作系统获得控制,特权指令执行被禁止,这样可以防止用户程序有意或无意的破坏系统。
阅读全文
摘要:循环不变式(loop invariant)
We use loop invariants to help us understand why an algorithm is correct. We must show three things about a loop invariant:
· Initialization: It is true prior to the first iteration of the loop.
· Maintenance: If it is true before an iteration of the loop, it remains true before the next iteration.
· Termination: When the loop terminates, the invariant gives us a useful property that helps show that the algorithm is correct.
阅读全文
摘要:getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析。
char是字符型数据,如果以为0~255共256个字符,但如果赋给char负数,会怎样?
如果将char强制转换为int型,结果又会怎样?
需要清楚一点,在计算机中,不管数据类型是char、int、long、double等,数据都是按照二进制的方式存储的,一般是以补码的形式存储的,这可以通过单步跟踪进行观察验证。char数据也是,比如字符a对应的ASCII码为97,即二进制的0110_0001,那么将97赋给一个char型变量,这个char型变量就是字符a了,操作数对于计算机来说就是对应的二进制数据,计算机可不管你是char型还是int型,这也就是测试1中ch赋值为-128与128时,运行结果完全相同的原因,因为-128与128的8bit表示是一样的,赋给ch之后都是1000_0000。
阅读全文
摘要:问题
抽象后的问题如下:输入两个整数m和n,(m n).输出0~n-1范围内的m个随机整数的有序列表,不允许重复。
也就是说,要对0~n-1范围内的数字进行选择,每个数字被选中的概率相等.
有两点要注意:不允许重复,结果有序;
阅读全文
摘要:本章以排序为例,展示了编程过程中的一般步骤。
主要针对插入排序、快速排序进行了讨论。
之前看过一本书《剑指offer》,感觉写的很好,有具体的实例,对每个题都给出思路以及实例,并对编程中的要点进行说明,代码风格也很好,现在看这本《编程珠玑》,是因为想多了解一些编程以及算法方面的理论。
书快看完了,个人感觉这本书内容还不错,但是表达方式比较晦涩,不太好理解,比如说代码的思路说明不够清楚、编程的风格也比较糟糕,有些术语也不太好理解,比如脚手架(书中的意思是测试框架)、程序验证(书中的意思是证明编程思路的正确性)、算法调优、代码调优等。
本章的内容有些表叔还是很晦涩,排序本来是很简单的,而本章中提到的思路有的却是不好理解(有的效率还比较低),看了很长时间,才看懂。
下面给出根据书中的思路写出的完整代码,以及测试“脚手架”,“脚手架”在此处的测试却是挺好用。后面附上了测试结果,给出了待排序数组为1000,000时每种排序的时间消耗。
阅读全文
摘要:本章通过一个实例,展示了算法设计艺术,展示了一些算法设计的常用技术。
问题描述:
输入是具有n个浮点数的向量x,求输入向量的任何连续子向量中的最大和。
下面给出三种实现方法的代码,以及测试结果。
阅读全文
摘要:本章主要讲解粗略估算、以及如何进行粗略估算。
对于大多数程序员而言,可能觉得粗略估算与编程没有什么关系,本章给出了一些简单的例子,说明粗略估算可以帮助快速估计程序的性能,验证程序的正确性。
自己在编程中基本没有用到过粗略估算,所以对于粗略估算的作用还是理解不深,希望以后在应用中慢慢提高吧。
阅读全文
摘要:第六章主要从理论上分析了提高程序性能的几个设计层面,包括:
问题定义:狼嚎的问题定义可以避免用户对问题需求的过高估计;
算法和数据结构:通过数据结构以及算法,改进性能,这也是使用较多的方法;
算法调优,不太明白此处的算法调优的含义,与算法与数据结构上的改进有何不同???;
数据结构重组,与上同,具体指的是???;
代码调优,指的是通过代码的调整(应该指的是从代码结构、编程语言上改进),书中给出了一个使用汇编语言重写函数,获得了2.5倍加速的例子;
硬件,更快的硬件可以提高系统的性能。
阅读全文
摘要:本章主要讨论如何根据伪代码编写程序,并用脚手架测试程序的正确性。
作者使用脚手架这个名词,刚开始看,真看不懂,估计是语言习惯的问题,看完这一章,才大致明白就是测试代码所搭建的程序。
书中的脚手架主要是采用assert进行测试,自己觉得很不习惯。
下面是自己写的二分搜索的递归以及非递归实现,并附上测试结果。
阅读全文
摘要:通过对二分搜索法的实例分析,展示了程序验证的的诸多优势:问题很重要,需要认真地编写代码;程序的开发需要遵循验证思想;可以使用一般性的工具进行程序的正确性分析。
阅读全文
摘要:本章集中讨论了数据结构对软件的一个贡献:将大程序缩减为小程序。数据结构还具有其他许多的正面作用,包括节省时间和空间、提高可移植性核可维护性。
阅读全文
摘要:本章围绕三个问题进行算法讨论,包括元素的查找、字符串的旋转、以及变位词的查找。
下面给出了实现代码、以及测试结果。
阅读全文
摘要:分析算法的好坏,一般从两个角度进行,时间复杂度与空间复杂度,通过理论的分析,可以得到这两个参数,但能不能得到实际代码具体的运行呢?
书中给出了空间、时间开销模型,用于分析代码的空间、时间开销,可以解决这个问题。下面给出具体的时空开销模型代码。
阅读全文
摘要:本书以一个排序的问题开篇,讨论了排序的最佳方法,并引入了位图排序的算法。实际上,此处的位图排序本质就是计数排序(关于计数排序,此处不再赘述),只不过由于此处问题的特殊性——数据没有重复,可使用更加节省空间的方法,对每一个数据,使用1bit的空间进行计数。
书中还给出了用标准库函数qsort、以及模板类set排序的提议,以与位图排序的性能进行比较,下面给出了几中排序方法,包括:
使用模板类bitset作为计数数组实现位图排序,具体实现见代码中BitmapSort_1函数;
用int型数据模拟bit型的操作实现位图排序,具体实现见下面代码中BitmapSort_2函数,该函数可在C语言下实现;
用标准库函数qsort实现排序,具体实现见下面代码中main函数中qsort;
用C++的模板类set或multiset实现排序;
上面几种方法,方法2是书中的方法,且可以用C语言实现,qsort也可用C语言实现,而其他两种方法必须用C++实现。使用前2中方法会受到用位图排序的使用场合的限制,而后面两种则没有限制。
阅读全文
摘要:EOF是文件的结束符,具体可以作为文本文件的结束符,也可以作为键盘输入char类型数据时的结束符。对于不同的系统,EOF的定义可能不同,一般定义为-1。因为char类型的数据范围是0~255,不可能是-1,EOF定义为0~255之外的数据理论上都是可以的。
一般在C语言中用getchar()函数或scanf获取char类型时,可用EOF作为结束符。但对于C++,若用getchar()函数或scanf获取char类型时,也可用EOF作为结束符,这是兼容C的特性;但若用cin获取char类型数据,若试图用EOF结束输入,输入ctrl+z时则会陷入死循环,具体见下面的实例。
阅读全文
摘要:itoa函数相对于atoi函数,比较简单,还是要注意考虑的全面。
阅读全文
摘要:atio就是将ASCII码表示的字符为int型数据,看似简单的问题,实际上需要考虑的很多。对于简单的问题,考虑是否全面就显得特别重要。
阅读全文
摘要:当使用的函数时重载函数时,若编译器不能判断出是哪个函数,就会出现二义性,并给出报错信息。
阅读全文
摘要:本函数给出了几种strcat与strncat的实现,有ugly implementation,也有good implementation。并参考标准库中的implementation,最后给出了比较好的implementation。
阅读全文
摘要:本函数给出了几种strcpy与strncpy的实现,有ugly implementation,也有good implementation。并参考标准库中的implementation,最后给出了比较好的implementation。
阅读全文
摘要:本函数给出了几种strlen的实现,有ugly implementation,也有good implementation。并参考标准库中的implementation,最后给出了比较好的implementation。
求字符串长度,可通过两种方式实现:
是在遍历字符串中字符的时候用一个计数器记录字符个数,如下面函数_strlen_1中所示;
可用指向字符串截尾的指针减去指向字符串开始的指针得到,这种方式写出的代码更加简洁,也是库函数采用的实现方式,如函数_strlen_2、_strlen_3、_strlen_4中采用的方式。
标准库函数并没有输入合法性检查,这将输入合法性检查的任务推给了函数的调用者。
对于strlen函数,好的implementation要考虑一下几点:
函数参数应为const;
返回值应为unsigned int;
注意输入合法性检查。
阅读全文
摘要:经常看到有建议说要使用 #include 代替 #include stdio.h,但很少有人提及这将把所有的symbol放进std namespace,而非 global namespace.这样,就必须写成std::printf(...)(注意是必须,但有的编译器却能通过,具体解释见下面),简单的写成printf是不行的。
阅读全文
摘要:primer上说++优先级高,但我网上查了下,好多说二者优先级一样,从右向左。
这两种解释的结果是一样的。哪个是对的?
阅读全文
摘要:大多开发软件的装目录下都有很多有价值的东西,比如help文档、user guide、src文件等。今天在VS的安装目录下发现了库函数的源文件,这些文件中有对所有库函数的实现,是Microsoft Corporation写的,应该都是经过优化的,以后在需要自己实现这些函数时,可以作为参考。
阅读全文