我在M2公司做架构之算法

一、算法的定义

算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰 指令 ,算法代表着用系统的方法描述解决问题的策略机制。

二、算法的特征

  • 有穷性;
  • 确定性;
  • 可行性;
  • 输入;
  • 输出。

1.有穷性

算法的指令或者步骤的执行次数和时间都是有限的。

2.确定性

算法的指令或步骤都有明确的定义。

3.可行性

算法的执行步骤必须是可行的。

4.输入

一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件。

5.输出

一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的。

三、算法设计的要求

  • 正确性;
  • 可读性;
  • 健壮性;
  • 效率与低存储量需求。

1.正确性

算法应当满足具体问题的需求,能够通过特定的问题测试。

2.可读性

算法主要是为了人的阅读与交流,其次才是机器的执行。

3.健壮性

当输入非法的数据时,算法也能够适当的做出反应或进行处理,而不会产生莫名奇妙的输出结果。

4.效率与低存储量需求

效率指算法运行的时间,执行时间短效率高;存储量需求是指算法执行过程中所需的最大存储空间。
二者都与问题的规模相关,同时也要根据实际需求决择,要效率,还是要节省空间,或者折中。一般情况二者不可得兼,要么用空间换时间,要么用时间换空间。

四、系统架构涉及到哪些算法

  • 公司自研业务核心算法(属于商业机密,不可外传);
  • 开源中间件算法(负载均衡算法、一致性Hash算法、LRU算法、Hyperloglog算法、Gossip算法、Raft算法、GeoHash算法、二叉树、红黑树、Btree、B+Tree等)。

五、程序员必须掌握的数据结构和算法有哪些

1.数据结构

  • 数组;
  • 链表;
  • 栈;
  • 队列;
  • 散列表;
  • 二叉树;
  • 图;
  • 堆。

2.算法

  • 常用基础算法;
  • 排序算法;
  • 搜索算法;
  • 树与图。

(1)常用基础算法

  • 分治算法;
  • 贪心算法;
  • 二分查找;
  • 分支界限算法;
  • 动态规划算法。

(2)排序算法

  • 插入排序;
  • 冒泡排序;
  • 选择排序;
  • 希尔排序;
  • 堆排序;
  • 归并排序;
  • 快速排序;
  • 桶式排序。

(3)搜索算法

  • 回溯算法;
  • 深度优先搜索算法;
  • 剪枝算法;
  • 广度优先搜索算法;
  • 枚举算法。

(4)树与图

  • 最短路径;
  • 最小生成树;
  • 关键路径;
  • 多路查找路径;
  • 图的遍历。

六、使用Java实现十大经典算法

参考如下链接:
java实现十大经典算法

七、算法对于程序员而言究竟有没有用

从我自己的角度而言来看,就目前而言看起来没用,但对于将来可能的一些发展,是有用的。
去年L博士对我说,不要畏惧算法,迟早都要面对的。

当初在创业公司就预测过算法对我的重要性,那个时候为此也坚持学习了一段时间,写了一些文章和读书笔记,链接如下:
初学者摸索之算法学习

算法图解-读书笔记如下:
算法图解之二分查找
算法图解之内存的工作原理
算法图解之大O表示法
算法图解之数组和链表
算法图解之选择排序
算法图解之递归
算法图解之快速排序
算法图解之散列表
算法图解之广度优先搜索

数据结构与分析-读书笔记如下:
<数据结构与算法分析>读书笔记–递归
<数据结构与算法分析>读书笔记–实现泛型构件pre-Java5
<数据结构与算法分析>读书笔记–利用Java5泛型实现泛型构件
<数据结构与算法分析>读书笔记–函数对象
数据结构与算法分析>读书笔记–数学知识复习
<数据结构与算法分析>读书笔记–模型
<数据结构与算法分析>读书笔记–要分析的问题
<数据结构与算法分析>读书笔记–运行时间计算
<数据结构与算法分析>读书笔记–最大子序列和问题的求解
<数据结构与算法分析>读书笔记–运行时间中的对数及其分析结果的准确性

为打好算法相关的基础,结合相关书籍,写相关代码,代码仓库地址为:AlgorithmOfhomework

但实事求是的说,虽然做出了一些坚持和努力,但是收获仍然不是很多,原因在于偏重于笔记的记录、书上代码案例的模仿而欠缺实际的做题,通过做题能够把”死”的数据结构和算法的知识给充分调动起来。

八、算法不好会不会影响写代码

客观地说,分情况看。
如果是写简单且逻辑复杂性很低的CRUD代码,完全是没有影响的。
如果如果是写逻辑复杂性很高的CRUD代码,则有较大的影响。
因为通常数据结构和算法基础扎实的人,写这样的代码,游刃有余,如果这方面欠缺太多的话,写起来很吃力,这一点我在之前的教育SaaS公司深有体会。
但总的来说,不断的学习和总结,是能够使人变得聪明起来的,这也是人们常说的,天道酬勤

文章目录
  1. 一、算法的定义
  2. 二、算法的特征
    1. 1.有穷性
    2. 2.确定性
    3. 3.可行性
    4. 4.输入
    5. 5.输出
  3. 三、算法设计的要求
    1. 1.正确性
    2. 2.可读性
    3. 3.健壮性
    4. 4.效率与低存储量需求
  4. 四、系统架构涉及到哪些算法
  5. 五、程序员必须掌握的数据结构和算法有哪些
    1. 1.数据结构
    2. 2.算法
      1. (1)常用基础算法
      2. (2)排序算法
      3. (3)搜索算法
      4. (4)树与图
  6. 六、使用Java实现十大经典算法
  7. 七、算法对于程序员而言究竟有没有用
  8. 八、算法不好会不会影响写代码