一个程序运行的总时间主要和两点有关:
    执行每条语句的耗时(取决于计算机、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记法 算法的最优性能