算法基础
- 问题定义:正确明确问题是什么
- 时间—空间折中与双赢:尽可能的减少时间和空间
- 简单的设计:尽可能的简单但不要过于简单
算法设计
排序:排序最显而易见的用处是产生有序的输出,该输出既可以是系统规范要求的一部分,也可以是另一个程序(例如二分搜索程序)的前期准备工作。
标识:当使用等价关系来定义类时,定义一种标识使得类中的每一项都具有相同的标识。而该类以外的其他项则没有该标识。
数据结构选择
将大程序缩减为小程序。正确的数据结构设计可以节省时间和空间、提高可移植性和可维护性。
注:程序员在节省空间方面无计可施时,将自己从代码中解脱出来,退回七点并集中心力研究数据,常常能有奇效。(数据的)表示形式是程序设计的根本
下面是退回起点进行思考时的几条原则。
- 使用数组重新编写重复代码。冗长的相似代码常常可以使用最简单的数据结构——数组来更好地表述。
- 封装复杂结构。当需要非常复杂的数据结构时,使用抽象术语进行定义,并将操作表示为类。
- 尽可能使用高级工具。超文本、名字—值对、电子表格、数据库、变成语言等都是特定问题领域中的强大的工具
- 从数据得出程序的结构。通过恰当的数据结构来替代复杂的代码,从数据可以可以得到程序的结构。万变不离其宗:在动手编写代码之前,优秀的程序员会彻底理解输入、输出和中间数据结构,并围绕这些结构创建程序。
编写正确的程序
问题很重要,需要认真地编写代码;程序的开发需要遵循验证思想;可以使用一般性的工具进行程序的正确性分析。
断言:输入、程序变量和输出之间的关系勾勒出了程序的“状态”,断言使得程序员可以准确阐述这些关系。(用来检查输入参数是否满足一定条件并对其进行‘论断’)(assert(n>0),n>0的话正常运行,其他情况则会报错)
顺序控制结构:执行这条语句然后执行下一条语句的形式。可以通过在语句之间添加断言并分别分析程序执行的每一步来理解这样的结构
选择控制结构。这些结构包括不同形式的if和case语句;在程序运行过程中,多个分支中的一个被选择执行。我们通过分别分析每一个分支说明了该结构的正确性,一定会选择某个分支的事实允许我们使用断言来证明。
迭代控制结构、要证明循环的正确性就必须为其确立3个性质:初始化,保持,终止
函数。要验证一个函数,首先需要使用两个断言来陈述其目的。前置条件:是在调用该函数之前就应该成立的状态。后置条件的正确性由函数在终止执行时保证
程序验证的角色
违反断言语句的情况指明了程序的错误所在,而对相应情况形式的分析则指出来在不引入新错误的情况下如何修正程序中的错误。调试过程中,需要同时修正错误代码和错误的断言;总是保持对代码的正确理解,不要理会那种“只要能让程序工作,怎么改都行”的催促。
编程小事
脚手架。最好的脚手架通常是最容易构建的脚手架。
编码。对于比较男鞋的函数,使用方便的高级伪代码来构建程序框架,然后将伪代码翻译成要实现的语言
测试。在脚手架中对组件进行测试要比在大系统中更容易、更彻底
调试。对隔离在其脚手架中的程序进行调试是很困难的,但是若将其嵌入真是运行环境中,调试工作会更困难。
计时。即程序的运行时间。(很重要)
注:此文引自:《编程珠玑》第二版修订版 [美] Jon Bentley 黄倩 钱丽艳 译 刘田 审校 人民邮电出版社
来源:CSDN
作者:Wendy2882
链接:https://blog.csdn.net/qq_42823993/article/details/104646921