.NET工程师需要了解和掌握一些基础知识,也就是作为专业技术人员需要的专业通识。
1.知识图谱
1.1数据结构
名称 | 说明 |
---|
栈 | 存储线性元素的物理结构,具有后进先出的操作特性。堆是heap,栈是stack,堆栈是stack。包含入栈和出栈两个操作。 |
队列 | 一种线性结构,允许在队列的的一端插入数据,在另一端删除元素。插入元素的一端叫队尾,删除元素的一端叫队首。 |
数组 | 一种线性结构,用一组连续的内存空间来存储一组具有相同类型的数据。 |
树 | 非线性数据结构,由结点或顶点和边组成,不存在任何环状结构。典型的树有二叉树、平衡二叉树、红黑树等。 |
链表 | 一种线性结构,和数组类似,常见的链表有无头单向非循环链表、带头双向循环链表等。 |
哈希表 | HashTable。一种对数组进行了扩展的数据结构,能够根据关键码(key)去寻找值(value)。 |
图 | 既非线性也非树状的数据结构,在图中数据可以是任意关系,由顶点和边组成。 |
优先队列 | 普通队列是先进先出、后进后出。优先队列是出队列顺序和入队列顺序无关,和优先级有关。 |
堆 | 堆是优先队列的一种实现方式,实现入队和出队操作时效率较高。堆一般是二叉堆,即满足一些特殊性质的二叉树。 |
1.2常用算法
名称 | 说明 |
---|
递归算法 | 直接或间接的不断重复调用自身来解决问题的方法。过程中不能无限制的调用,必须要有一个出口,作为结束递归的条件,否则会出现死循环。用来解决诸如阶乘、费波切纳数列、汉诺塔问题等。 |
分治算法 | 待解决复杂的问题简化为若干小规模相同的问题,然后逐步划分解决,便于问题的解决。可以用来解决棋盘覆盖、找伪币、求最值等。 |
动态规划算法 | 动态规划和分治类似,均为将原问题划分为子问题的组合进行解决的方法。区别是分治的子问题是相互独立存在的,动态规划应用于子问题重叠的情况。如:0-1背包问题、钢条切割问题等。 |
贪心算法 | 就待解决问题考虑局部最优选择,而不从全局最优来考虑,通过局部最优希望达到全局最优。如:背包问题、均分纸张、最大整数等。 |
回溯法 | 一种搜索算法,从原始的根节点出发,按照深度优先的策略进行搜索。当达到某个节点后,探索该节点是否包含问题的解。假如包含那么进入下一个节点进行搜索,假如不包含则回溯到上级父节点选择其他分支搜索。如:0-背包问题、旅行商问题、八皇后问题等。 |
分支界限法 | 一种搜索算法,与回溯法相似。区别是回溯法是找到问题的许多解,分支界限法是找出一个解。或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,简单来讲就是在某种情况下的相对最优解。如:装载问题、旅行售货商问题等。 |
1.3设计原则
名称 | 说明 |
---|
单一职责原则SRP | 接口或类只提供一种业务实现。每个接口、类的功能只能用来做专门的事,强调系统内业务职责的唯一性,避免职责扩散。 |
开放关闭原则OCP | 对扩展开放,对修改关闭。在已有系统基础上进行开发,不要对正常运行的源码进行修改操作。需要对需求拓展时,通过添加新的类和新的代码来实现,对已有代码做到最少修改。 |
依赖倒置原则DIP | 面向对象编程,通过接口或者抽象类提供依赖关系。各个业务模块之间的依赖关系通过约定的接口或者抽象类来实现,不涉及具体实现细节,细节由具体的实现类来完成。 |
接口隔离原则ISP | 接口中的方法和属性都是实现类所需要的,没有多余的信息。接口的内容对于实现没有冗余的代码。 |
里氏替换原则LSP | 使用父类的地方可以使用子类替换。子类尽量不要重写父类或者接口中已经实现的方法,即子类和父类逻辑保持一致性。 |
迪米特法则LOD | 最少知道原则,核心思想是低耦合、高内聚。用于弱化代码之间的依赖关系。 |
1.4设计模式
- 创建型模式
- 结构型模式
- 代理模式
- 装饰器模式
- 适配器模式
- 外观模式
- 桥接模式
- 组合模式
- 享元模式
- 行为型模式
- 策略模式
- 命令模式
- 责任链模式
- 观察者模式
- 模板方法模式
- 迭代模式
- 备忘录模式
- 状态模式
- 访问者模式
- 中介者模式
- 解释器模式
其中最常用到的是工厂模式、单例模式、代理模式、装饰器模式、适配器模式、策略模式、命令模式、责任链模式、观察者模式、模板方法模式。