一个程序运行的总时间主要和两点有关:
执行每条语句的耗时(取决于计算机、Java编译器和操作系统),
执行每条语句的频率(取决于程序本身和输入)。
二者相乘并将程序中所有指令的成本相加得到运行总时间。
成本模型
对数级别,logN,如二分查找
指数级别,2^N,如穷举查找
最希望为各种基础问题找到,线性对数、线性或者是对数级别的算法
进行倍率试验 P121
注意事项:
大常数,
非决定性的内循环,
指令时间(如使用缓存来组织内存)
系统因素,
不分伯仲,
对输入的强烈依赖,
多个问题参量
处理对于输入的依赖
随机化算法
均摊分析
内存
对象
链表
数组
字符串对象
字符串的值和子字符串P129
子字符串的创建所需空间和时间,与其长度无关
栈:递归调用(创建对象)有时候很危险,有可能导致栈溢出,
堆:
64位架构,使用8字节表示地址/引用
Java对象要有24字节的对象头,而数组如int数组就是24+4N字节(N为奇数时还有填充字节),double数组则是24+8N字节
String对象总共会使用40个字节(16字节表示对象,3个int实例变量个需要4字节,加上数组引用的8字节和4个填充字节)+(24+2N)字节字符数组(字符串间共享)
大O记法 运行时间的上限
大Omega记法 运行时间的下限(即最坏情况)
大Theta记法 算法的最优性能