数据结构与逻辑代码(一)
来源:互联网 发布:网络监视窥探隐私 编辑:程序博客网 时间:2024/05/16 05:12
前言
《大教堂和市集》中有这样一句话:聪明的数据结构和笨拙的代码要比相反的搭配工作的更好 ,我深以为然。本篇博文就是对此话题的个人简单理解,涉及的编程问题基本上来源于Codewars。
关于《大教堂与市集》中文版可访问这里
释读
Pascal之父——Nicklaus Wirth提出著名公式“算法+数据结构=程序”
本篇博文的主题也可以用简单的数学语句表达出来:
聪明的数据结构 + 笨拙的逻辑代码 > 笨拙的数据结构 + 聪明的逻辑代码
极端的说法是:优秀的数据结构远比优秀的逻辑代码要更好用。
以下举一个来自Codewars中的编程问题:Playing on a chessboard
题目描述:给定一个输入参数n,它会得到一个二维数组(类似矩阵),行方向以1/2,2/3,3/4这样的方式递增,列方向以1/2,1/3,1/4这样的方式递增。返回一个数组,其值为所有元素的求和,如果求和值能约简为整数,则返回整数,否则返回[分子,分母]。
一个n=3
时的数组例子:
[[1/4,2/5,3/6],[1/3,2/4,3/5],[1/2,2/3,3/4]]
初始解题思路是:先生成一个长度为n的二维数组,然后通过二次for循环对数组写入正确的值(这样好方便下边的计算),然后对数组中的所有元素进行求和,判断求和值是否能约简为整数,返回相应要求的数组。
然而,这个解法太死板了,于是我去看了看其他程序员的解法,然后,非常震惊的解法找到了,该解法的思路是:先找到n与求和值结果之间的数学关系,关系是:从生成数组的左上至右下方向观察数据,发现其值为n/2或(n+1)/2,然后我们得到了输入参数n和求和值之间的数学关系是:n*n/2
这便是所要求得结果,所以,最后的解决方案是:
function game(n) { return n%2==1?[n*n,2]:[n*n/2];}
被震惊到了吧!这里有这样一个逻辑:观察相关的数学关系表达式,这便是所谓的聪明的数据结构了,而逻辑逻辑代码则因为数据结构的关系,变得异常简单(实际只是一个if判断),而初始思路则可看出笨拙的数据结构(未得到数学表达式之前的数据结构)的表现了。
(未完 待补写)
- 数据结构与逻辑代码(一)
- 逻辑组合与代码整理及优化(一)
- 可读代码的艺术(一):简化循环与逻辑
- Openmesh 的遍历数据结构与逻辑处理代码的分离
- Java数据结构与算法之数据结构-逻辑结构-集合(一)------集合类简析
- 数据结构与算法:逻辑分析
- 离散数学(一):逻辑与证明笔记
- 数据结构之逻辑结构与物理结构(存储结构)
- 数据结构与算法(一)
- 数据结构与算法(一)
- 数据结构与算法(一)
- 数据结构与算法(一)
- 数据结构与算法(一)
- spring+hibernate+Struts分页逻辑共享(一)代码解析
- 看数据结构写代码(33) 树与回溯法(一) 子集树
- 数据结构算法代码实现——树与二叉树(一)
- 数据结构(一) 抽象数据类型的表示与实现 代码示例
- 数据结构逻辑结构与存储结构
- JAVA为什么要配置环境变量,怎样配置
- Redis和Memcache对比及选择
- MOOC的Python笔记(三)基本算术、逻辑操作符
- [Python]整数和浮点数,布尔类型
- linux和vi命令技巧
- 数据结构与逻辑代码(一)
- Qt学习笔记之如何保存软件关闭前的相关设置
- 事务性质和隔离级别
- 别废话,上车
- iOS备忘录之本地数据详解
- Redis几个认识误区
- VS---“重新生成解决方案”和"生成解决方案"的学习
- Codeforces 665A - Buses Between Cities
- 《Nodejs开发加密货币》之三:Nodejs让您的前端开发像子弹飞一样