0.前序
y2k综合征:
这个是什么意思,依照我对书的理解是这样的,也就是不要过早优化,因为我们的程序90%的代码占程序运行时间不到10%,我们通常依照自己的部分认识,认为这部分代码需要优化,认为这段代码会出现问题,所以导致后面修改,代码就出现了不稳定,其实这些都是没有必要的。我的做法通常是养成良好的编程习惯,然后在程序即将结束的时候再进行优化.
上下文和组合:
上下文,这个词在我编程了好久之后才知道是什么意思,我觉得可以这么理解,他是对复杂的环境的一种很概况的代表,比如说这个上下文他的背后是很复杂的设计模式,而上下文的提出也很好的简化了这个表面,从而我们可以使用组合,其中一个代表就是android里面的context.这是一个很有趣的东西
关于已检测异常:
这是一个很重要的点,有点颠覆了我的想法,文中是说我们现在使用异常捕获的习惯就像是把注意力放在了如何捕获异常,而不是使这个程序根本就没有异常,这是一个很重要的讨论,在我之前的项目中,无论是http还是pull我使用的都是写一个大的异常,然后捕获打印出来,然后就不理了,长此以往我习惯了这一点,不加思考的加异常捕获,习惯了这一点,而问题的核心是在代码中,我们需要解决这些异常,而不是去逃避这些(因为这些始终会浮现出来的),这些还会让你代码的可读性变差,所以该写就写,而且要想办法怎么解决这些异常.
模式概念:
设计模式帮助你从别人的成功经验而不是自己的失败经验中学到更多的东西。这句话我觉得太经典了,有些人失败了常说当是经验积累,但是有很多东西并不是一定要失败了才会懂的,这么说,一生都在失败也学不完这东西,so,总结自己和别人的经验,人生,失败几次就已经够你受的了,题外话
设计模式对我来说,是一种思路,另一种思维的颠覆,对人生的思考,太棒了,而他的目的就我而言也就在于低耦合高内聚,这是什么意思呢,比如说建一个房子,我可以把一堵堵的墙搬过来,然后骑起来,而设计模式提供给我们的思路是,打地基,使用水泥,一块块的砖头,当房子需要改建,只需换瓷砖就好了,更多的是,你这一套房子可以不做大的变化变成豪宅,变成别墅,酒店,钟点房,相同的东西没有必要重复,我也觉得这一点很对,经常两个很多部分相同的代码,但是却要重新写一遍,只是变量的名字变了一个而已,能否将这些不变的东西抽象出来呢,这就是设计模式的目的了..
相似的范畴:
惯用法:就是在代码中实现某种功能。
特定设计:解决某一特定问题提出的方法
标准设计:解决某类问题提出的方法,这个就类似我们平时写的工具类
设计模式:为了解决一大类问题而提出的问题,也就是在标准设计之上再抽象
设计原则:
这些原则是检测自己程序一个很好的测试吧
.尽量不要让人感到奇怪:意思就是你的设计为了追求特别而去特别
.使一般问题简单化,罕见问题行得通:这是一个很重要的思想,看起来简单,这是我一直坚持的东西,就比如 android,许多人喜欢自定义自己的view,一个视图就一个view,或者实现某种功能,但是我的理解是将现在拥有 的东西完全利用上就ok了,其实android的sdk已经能让你飞起来的了,不要重复制造轮子,使用最简单的方法解决 问题
.一致性:这是什么意思呢,保持风格一致性,这为你的代码重用性带来很多的帮助的,在一个案例中就是android开 发中ui设计是用来n多个不同的颜色,相同的界面却许多不同的颜色,这不但导致程序混乱,而且界面也很乱
.得墨忒耳法则:这个名字太奇怪了,得墨忒耳是希腊管理土地的神,这个法则是说不要和陌生人说话,也就是一个对 象最好只引用自己的属性(额,这个原则相信不可能办到吧)
.减法原则:当你不能从设计中去掉任何一个东西的时候,这个设计就完成了
.先简单后通用:要知道很多系统需要的通用性不高的,如果一味追求通用,那么就会衍生出一大堆的无用配置项,这 是没有必要的,所以先简单,后通用,而且简单的,往往是通用的,我恰好看到剃刀原则,我才意识到我犯了这个错 误之前一个方法,我追求一个类的通用性,为他配置了许多方法什么的,。但是才发现,许多方法根本用不上,。而 这个类也显得特别的臃肿.其实干脆就写几个类(实现同一个接口或者基类就好了).
.自反性:这一个词我在离散数学中接触过,好难表达,一个类对应一个抽象,这个原则也叫做同构,同构在化学中好 像是指两个相同的分子,只是组合不一样,然后导致了不一样的性质,我觉得这个原则想表达的意思可能是一个类有 一个自己对应的一个抽象.
.独立性:独立表达一个单独的想法,这个原则的意思其实就是我们用的最多的分离,封装,多态,通过这个把每一个部 分独立起来,实现高内聚,低耦合.
.一次且只能出现一次:这个在我现在的代码中,我慢慢用上了,当我写这个方法的时候,我第一步做的是不是马上开 始写,还是思考有没有其他东西会用到这个方法,或者有没有用到类似的方法,与我把他们都封装起来,通过简单的 参数配置就可以实现了一个方法满足一类相似的问题(注:其实这是很难把握的一个度,因为你如何确定这些是相类似 的方法,如果都统一起来,那么这个方法会变得效率低下,臃肿,所以我的原则就是能简单配置在一起的就配置在一 起,否则就不要勉强).
模式分类:
.创建型:包括创建对象,分离对象,这里一个很重要的point是,如何让你的代码脱离类型,不依赖类型编程,这个 就牵涉到之前学习的think in java 中的内部类等等知识,而且当加入新的类型,代码不需要改变,我们抽象一下这 句话的意思是,我有一个工厂,生产很多产品,然后接到订单,要生产玩具,但是我们的工厂器具不需要变,然后马 上就可以开始生产玩具.
.结构型:设计出满足某些工程特定约束的对象,我的理解是,他们的关系不变,这是重点,我和a君是朋友,当a君变 了性,我们还是朋友,我还是可以使用它的某样接口,这里我的一些想法就是保持接口稳定性,然后再进行内部优化.
行为型:指一个程序里处理一系列特定类型操作的对象。或者说他们封装了一系列的行为,例如迭代器,吧迭代这个 行为封装起来了。这一个是需要认真学习的,我毕竟接触的还不够.
当我读到这里,我深深的感受到什么是编程,感受到好久之前上的一节选修课软件工程,老师说:编程是不断的反映真实世界的思想。现在我能深深的感受到,无论是android,java还是c++,这些都是工具,而算法设计模式这些由哲学数学演变而来的伟大思想才是指导我们创造出美好的程序的根本,你对这个世界的理解,对生活的理解,所以我经常会说编程实质是完成一件艺术品,而编程者就是一名艺术家,不断的通过程序表达自己的思想..
分享到:
相关推荐
0.前序遍历(递归&迭代&Morris) 1.中序遍历(递归&迭代&Morris) 2.后序遍历(递归&迭代&Morris) 3.层序遍历(递归&迭代) 1.重建 0.基于前序和中序遍历 0.基于中序和后序遍历 1.检索树 0.二叉检索树 1.伸展树 2.平衡...
只有二叉树中每个节点度为 2 或者 0 的时候,已知前序遍历序列和后序遍历序列,才能唯一地确定一颗二叉树,如果二叉树中存在度为 1 的节点时是无法唯一地确定一棵
前序遍历是一种访问二叉树节点的方法,顺序为:根节点 -> 左子树 -> 右子树。在前序遍历过程中,我们可以按照此顺序将树序列化为一个字符串,以便存储和传输。 对于题目“LeetCode 331. 验证二叉树的前序序列化”,...
本教程将深入探讨如何在Python中实现二叉树的创建、前序遍历、中序遍历以及层次遍历。 首先,我们来理解二叉树的链式存储结构。在Python中,我们可以用类来表示二叉树的节点,每个节点包含一个值、一个指向左子节点...
9. 度为2的结点与度为0的结点关系:若二叉树有45个度为2的结点和6个度为1的结点,那么度为0的结点(叶节点)个数为45+6+1=52。 10. 前序和后序相同的二叉树:可能是空树或者只有一个节点的树。 11. 有向图的入度...
### 有前序中序求后序遍历 在数据结构的学习中,二叉树的遍历是非常重要的概念之一。二叉树的遍历方法主要包括三种:前序遍历、中序遍历以及后序遍历。每种遍历方式都有其独特的应用场景,而在实际编程中,有时候...
node = queue.pop(0) visit(node) if node.left is not null: queue.append(node.left) if node.right is not null: queue.append(node.right) ``` 以上四种遍历方法各有其特点和用途,理解并熟练掌握它们对...
### 二叉树的前序遍历 #### 一、二叉树简介 二叉树是一种常见的数据结构,在计算机科学中被广泛应用于多种算法和数据处理任务中。它由节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树...
每个节点的编号为从0到10的整数,左子节点和右子节点分别通过特定公式确定。 2. **遍历过程**:通过递归函数`go()`进行前序遍历,同时记录每个节点的深度。函数内部首先增加当前的深度值,然后打印当前节点的编号,...
算法笔记,前序与中序遍历构造二叉树 本资源主要讲解了如何使用前序遍历和中序遍历来构造二叉树的算法,并提供了Java和Python的实现代码。下面是对该算法的详细解释: 二叉树的遍历规则 在解决这个问题之前,我们...
* 已知二叉树前序和中序,求后序 * @param pre * @param mid * @param last * @param i */ public static int i =0;//i:表示要插入后序序列的位置对于生成的后序序列,应该从最后位置开始写, // 所以...
示例 1:输出:[1,2,3]示例 2:输出:[]示例 3:输出:[1]示例 4:输出:[1,2]示例 5:输出:[1,2]提示:树中节点数目在范围 [0, 1
return 0; int leftDepth = treeDepth(root->left); int rightDepth = treeDepth(root->right); return max(leftDepth, rightDepth) + 1; } ``` 其中,`max()`函数用于取两个整数中的较大值。 综上所述,链式...
### C语言实现二叉树的前序、中序、后续遍历(递归法) #### 一、前序遍历 前序遍历是二叉树遍历的一种方式,其顺序为“根节点 -> 左子树 -> 右子树”。这种遍历方式在很多应用场景中都非常有用,例如构建表达式树...
if (root == null) return 0; int leftDepth = maxDepth(root.getLeft()); int rightDepth = maxDepth(root.getRight()); return Math.max(leftDepth, rightDepth) + 1; } ``` #### 七、总结 本文详细介绍了...
7. 度为0和2的二叉树:如果高度为h的二叉树只包含度为0(叶子结点)和度为2的结点,那么结点数最少的情况是2^(h-1),即满二叉树的结构。 8. 中序遍历:中序遍历顺序是左子树-根结点-右子树,题目给出了二叉树的中序...
current = current.children[0] # 先压入所有子节点 current = stack.pop() print(current.value) # 访问根节点 current = current.next_sibling # 转向下一个兄弟节点 ``` 3. 层次遍历:Python的层次遍历使用...
### 二叉树前序、中序、后序遍历相互求法 #### 前序、中序、后序遍历定义与特性 在理解如何由两种遍历方式推导出另一种之前,我们首先需要明确这三种遍历的基本概念。 - **前序遍历**(Pre-order Traversal): ...
return 0; } ``` 在这个例子中,`buildTree`函数接收前序和中序遍历的序列,使用递归来构建出相应的二叉树。其他三个函数则分别进行前序、中序和后序遍历。 通过理解递归和二叉树遍历的概念,我们可以有效地处理...