阅读《Programming Pearls second Edition》后的一些总结和个人实践的套用

2024-01-04 03:08

本文主要是介绍阅读《Programming Pearls second Edition》后的一些总结和个人实践的套用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以下内容是我阅读《Programming Pearls second Edition》后
的一些总结和个人实践的套用。
1、程序员的主要问题不一定是技术上的,更可能是心理上的:
因为他正试图解决一个错误的问题,所以他不能取得进步。
通过打破概念上的障碍,转而解决一个更简单的问题,这样
我们最终解决了问题。
2、"问题越一般话,解决起来可能也就越容易",对于编程来说,
这就意味着直接解决一个23种情况的问题,要比编写一个处
理n种情况的通用程序,然后将该程序应用到n=23时的情况
更加困难.
3、代码的开发是自顶向下的(先从一般概念开始,然后再细化
到一行一行的代码),但正确性分析是自底向上底:我们将
从个别的代码行开始,研究它们如何一起协作以解决该问题。
当你在调试、修改代码或错误的断言语句是,要完全地理解
代码,抵御那种“改变代码,只要能让她运行起来就行”的
冲动。
4、保持代码的简单性通常是正确性的关键。

断言注释{}伪码例子(作者分析):
(断言:输入、程序变量以及输出之间的关系描述了程序的
 状态;断言允许程序员精确的说明这些关系。)

David Gries的咖啡罐问题。起初给你提供一个盛装了一些
黑豆和白豆的咖啡罐以及一大堆额外的黑豆。然后你重复进
行以下过程,直到罐中只剩下一粒豆子为止:
随机从罐中选择两粒豆子。如果它们颜色一样,就将它们扔
掉,并且在罐中放入一粒黑豆。如果它们颜色不一样,则将
白豆放回罐子,同时扔掉黑豆。
请证明该过程会终止。当一开始罐子里既有黑豆又有白豆是,
你能说出罐子里最后剩下的豆子是什么颜色的吗?
m:表示罐子里黑豆子的个数
n:表示罐子里白豆子的个数
简写形式sameColor()表示从罐中取出两粒豆子颜色相同

m=黑豆子数
n=白豆子数
{(m+n)>0}
loop
   if (m+n)==1
      {m==1 || n==1}
       if m==1
 {m==1}
  color=block;break
       else
 {n==1}
  color=whrite;break
 
   case
     sameColor()==black:
                {sameColor()==black && m>=2}
                 m=m-1;
  {(m+n)>=1}
     sameColor()==whrite:
  {sameColor()==whrite && n>=2}
  n=n-2;
  {n>=0}
  m=m+1;
  {(m+n)>=1}
     sameColor()==false:
  {sameColor()==false && n>=1 && m>=1}
  m=m-1
  {(m+n)>=1}
     {(m+n)>=1}
分析:循环终止时color将被赋值,在case中三种情况都会使罐
子中的豆子总数(m+n)减少一个,在初始使(m+n)>0,所以最
后罐子中肯定剩余一个豆子,m==1或n==1,可以使程序终止;

5、简单而且功能强大的程序可以让用户高兴并且也不会让程序构建
者烦恼,这是程序员的终极目标。

6、对实时软件系统进行性能计算时,我们必须按照2、4或6的系数
降低性能,以补偿我们的无知。在进行可靠性/可用性承诺时,
我们应该对我们认为能够满足的目标保留一个10的系数,以补偿
我们的无知。在估计鬼迷、成本以及进度时。我们应该保留2或4
的系数,以弥补我们在某个方面的缺漏。
爱因斯坦明言“任何事都应该做到尽可能的简单,除非没有更简
单的了”

7、分治法:要解决规模为n的问题,可递归解决两个规模近似为n/2
的子问题然后将他们的答案进行合并以得到整个问题的答案。

8、一个二分查找算法优化的例子:
算法一:
l=0;u=n-1
loop
    /*查找t在x[l..u]中的位置*/
    if l>u
       p=-1;break file://查找结束,t不存在x[l..u]中
    m=(l+u)/2 file://二分x[l..u]
    case
 x[m]<t: l=m+1
 x[m]==t:p=m;break
 x[m]>t: u=m-1
算法二:(优化后的算法)
l=-1;u=n
while l+1!=u
      m=(l+u)/2
      if x[m]<t
  l=m
      else
  u=m
p=u
if p>=n || x[p]!=t
   p=-1 file://t不存在x[l..u]中

说明:
算法一和算法二都完成了二分查找功能;如果t在x[l..u]中存在
多次,则算法一返回的位置可能是其中的任一个,但算法二会返
回最先的位置。虽然算法二看似比算法一难些,但是算法二更有
效率,因为算法一种可能对t的比较要多于两次,case中;弹算
法二只需比较一次。

9、代码优化原则:尽量少用代码优化;软件的许多其它属性和效率
一样重要,甚至更重要;在优化代码前,我们应该确保其它方法
不会提供更加有效的解决方案。

10、我本人的一个优化例子:
在对一个嵌入设备做存储操作时,其设配厂商提供了动态库中包
括了对设配存储区的完全重写操作,和单条记录添加、删除操作。
通过测试发现做单条操作与做完全重写所花费的时间基本相同,
甚至更多。原来,其存储介质为falsh,做任何操作都是先全部擦
除再重新写入。所以做单条操作会比完全重写要慢,而且操作要稳
定。从而我再也没有用过单条操作调用,而全都用完全重写,从而
提高了效率。也就是说,有的时候简单的操作,并不一定效率会高,
它有可能是组织了一些复杂操作的结果。就像,用%求于,要比用
if和减法慢的多。

10、减少空间通常带来运行时间上合理的副作用:程序越小,加载的时
候也越快,也越容易填充到高速缓存中;需要操作的数据越少,操
作时所花的时间通常也就越少。跨网络传送数据时所需的时间通常
和数据大小成正比。
压缩空间的关键是简单,简单性可以产生功能性、健壮性以及速度
和空间;

这篇关于阅读《Programming Pearls second Edition》后的一些总结和个人实践的套用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/567975

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear