算法复杂度分析的16条基本规则


分析一个算法的基本思想是看一看N个元素时,主循环的执行次数,基于此有如下18条基本规则用来查看算法的复杂度,下面为简述内容:

1. 设计循环时,需要保证循环内部有足够的工作。

2. 调用简单函数时,最好将其做成简单的内联函数或者宏。

3. 尽可能的使用与系统位数一致的数据,如32位的系统使用32位的数据。

4. 加法和减法尽量避免使用浮点数,其他时候也尽量用整数。

5. 将所有的数据结构调整成32位字长,编译器上可以手动调整,或者在代码中使用#program

6. 除非是简单类型的参数,否则绝不使用值传递的方式传递参数。

7. 尽可能的使用全局变量。

8. 不要使用register关键字。

9. 尽量编写比较简单的代码。

10. 参与整数运算的数必须是整数,参与浮点运算的数必须是浮点数,类型转化会影响效率。

11. 尽量采用位运算或者转化成部分位运算,可以提高效率。

12. 若要用到矩阵,请充分利用矩阵的稀疏性。

13. 复杂的数学运算尽量避免,或者找简单的方法实现,若不然亦可以预先将结果存到表中,用于查询,可减少复杂运算的占用的时间。

14. 若执行复杂的数学运算,且下面的代码需要再次执行它,那么将其存到高速缓存区。

15. 当循环本身占用的时间比内部执行的时间多,那么就展开循环,即:将循环展开成简单的单独代码,以8~32次为限度。

16. 可能造成效率损失的部分可采用嵌套汇编语言,防止编译器优化时导致的效率损失。

C语言#define定义常量的除法运算规律


若定义的数字本身为int,则结果为int,具体如下:

#define A   3
#define B   2
/* C 的值为 0 */
#define C  B/A 
/* value 的值为 0 */
int value = B/A;


若定义的数字本身为带有小数,则结果为float,具体如下:

#define A   5.0
#define B   2
/* C 的值为 0.4 */
#define C  B/A 
/* value 的值为 0.4 */
int value = B/A;


指针函数和函数指针详解


函数指针和指针函数就像绕口令一样的,有时候让人难以琢磨透,但是按照语法分析,一个是函数,一个是指针,因此区别还是蛮大的,下面针对函数指针和指针函数的进行说明。

继续阅读“指针函数和函数指针详解”