电子芯吧客盘点!各路大神的C语言编程建议和技巧( 三 )
规则 2:估量(measure) 在没有对代码做出估量之前不要优化速度 , 除非发现最耗时的那部分代码 , 要不也不要去做 。
规则 3:当 n 很小时(通常也很小) , 花哨的算法运行很慢 。 花哨算法有很大的常数级别复杂度 。 在你确定 n 总是很大之前 ,不要使用花哨算法 。 (即使假如 n 变大 , 也优先使用规则 2).例如 , 对于常见问题 , 二叉树总比伸展树高效 。
规则 4:花哨的算法比简单的算法更容易有 bug , 而且实现起来也更困难 尽量使用简单的算法与简单的数据结构 。
以下几乎是所有实际程序中用到的数据结构:
数组
链表
哈希表
二叉树
当然也必须要有把这些数据结构灵活结合的准备 , 比如用哈希表实现的符号表 , 其中哈希表是由字符型数组组成的链表 。
规则 5:以数据为核心 如果选择了适当的数据结构并把一切都组织得很有条理性 , 算法总是不言而喻的 。 编程的核心是数据结构 , 而不是算法 。 (参考 Brooks p. 102)
规则 6:就是没有规则 6 。
07
数据编程
不像许多 if 语句 , 算法或算法的细节通常以紧凑、高效和明确的数据进行编码 。 眼前的工作可以编码 , 归根到底是由于其复杂性都是由不相干的细节组合而成 。 分析表是典型例子 , 它通过一种解析固定、简单代码段的形式 , 对编程语言的语法进行编码 。 有限状态机特别适合这种处理形式 , 但是几乎任何涉及到对构建数据驱动算法有益的程序 , 都是将某些抽象数据类型的输入“解析”成序列 , 序列会由一些独立“动作”构成 。
也许这种设计最有趣的地方是表结构有时可以由另一个程序生成(经典案例是解析生成器) 。 有个更接地气的例子 , 假如操作系统是由一组表驱动 , 这组表包含连接 I/O 请求到相应设备驱动的操作 , 那么可以通过程序“配置“系统 , 该程序可以读取到某些特殊设备与可疑机器连接的描述 , 并打印相应的表 。
数据驱动程序在初学者中不常见的原因之一是由于 Pascal 的专制 。 Pascal 像它的创始人一样 , 坚信代码要和数据分开 。 因而(至少在原始形式上)无法创建初始化的数据 。 与图灵和冯诺依曼的理论背道而驰 , 这些理论可都是定义存储计算机的基本原理 。 代码和数据是一样的 , 或至少可以算是 。 还能怎样解释编译器的工作原理呢?(函数式语言对 I/O 也有类似的问题)
08
函数指针
Pascal 专制的另一个结果是初学者不使用函数指针 。 (在 Pascal 中没有把函数作为变量) 用函数指针来处理编码复杂度会有一些令人感兴趣的地方 。
指针指向的程序有一定的复杂度 。 这些程序必须遵守一些标准协议 , 像要求一组都是相同调用的程序就是其中之一 。 除此之外 , 所要实现的只是完成业务 , 复杂度是分散的 。
有个协议的主张是既然所有使用的功能相似 , 那么它们的行为也必须相似 。 这对简单的文档、测试、程序扩展和甚至使程序通过网络分布都有帮助——远程过程调用可以通过该协议进行编码 。
我认为面向对象编程的核心是清晰使用函数指针 。 规定好要对数据执行的一系列操作 , 以及对这些操作响应的整套数据类型 。 将程序合拢到一起最简单的方法是为每种类型使用一组函数指针 。 简而言之 , 就是定义类和方法 。 当然 , 面向对象语言提供了更多更漂亮的语法、派生类型等等 , 但在概念上几乎没有提出额外的东西 。
数据驱动程序与函数指针的结合 , 变成了一种表现令人惊讶的工作方法 。 根据我的经验 , 这种方法经常会产生惊喜的结果 。 即使没有面向对象语言 , 无需额外的工作也可以获得 90% 的好处 , 并且能更好地管理结果 。 我无法再推荐出更高标准的实现方式 。 我所有的程序都是由这种方式组织管理 , 而且经过多次开发后都相安无事——远远优于缺少约束的方法 。 也许正如所说:从长远来看 , 约束会带来丰厚的回报 。
推荐阅读
- 扫描器|远距离条形码扫描器型号盘点
- 电子青少年与电子烟:企查查显示电子烟企业三年增7.1万家
- 电子商务实战专家|华为再强,还离不开世界工厂,自嗨不是最好的选择?
- 法定代表人|林斌卸任北京小米电子产品有限公司法定代表人、经理,王川接任
- zol中关村在线|盘点京东值得入手的5G手机 价位不同却各有所长
- 慢慢买比价|618装机配置推荐丨从两千到两万全价位盘点,不同需求都能满足
- 博科园|太好了,在硅光电子芯片上实现:可编程的电路、可擦除的元件!
- |超级电子皮肤问世 天津大学研发“全天候”自愈合材料
- 雨后晴天电子商务|淘宝新品不好做?直通车快速引流打爆新品功能即将上线!
- 电子烟|深圳拟对电子烟门店开全国“第一罚” 商家或面临2千元罚款