思考缘起
这两天随便在CSDN上搜索题目做,搜到了经典的8皇后问题和智慧的贼问题,意识到算法的强大。家里人看到我在一堆数字中画圈圈,想用人脑来解决8皇后问题,还以为我在买彩票……
8皇后问题的解答,网上看到最经典的是DFS算法,当我试着不用该算法解决问题的时候,就意识到自己的脑子不够用了。智慧的贼题目也是一样。
当我想用人脑去写规则的时候,规则越多,就越容易得不到最全的答案。
而规则少的时候,计算机算量非常大,耗时长也能解决问题,可是就容易出现内存溢出的问题,根本等不到答案的冒泡。
如何让自己编写的算法最优化呢?
有题目文字描述的时候,规则 = 题干所有的限制条件。
没有任何一个题干内容是白写的,这和我们读书时候解数学题是一回事儿。当我们把题干的内容,作为限制条件写成算法的规则,去圈定计算机尝试的范围。这是最好的选择。
如果没有题干呢?
比如一个现实的问题,我们想用编程的方法,获得最优解,该如何用人脑去指定规则呢?
-
缩——寻找特例:将一个广谱的问题,缩小到一定范围,比如一个问题“8皇后在8x8的棋盘中,如何摆放才能让皇后们互不相见”,那我们就缩小到5x5,4x4,3x3的棋盘,自己摆摆看,找寻规律。
-
缩 = 让人脑做更多。问题是人脑提出限制条件越多,就越不可能覆盖真理的全部。
-
分析——如果要皇后互不相见,“满足每一行、每一列、每一斜列都独有一个皇后”就是我们分析后得到的约束条件,也就是需要人脑编程来指定的规则。
-
放——广谱化问题:还是那个8x8的皇后问题,如果广谱化摆放,即先在棋盘任意的位置摆放一个皇后,删除永久不能摆放的棋格,下一个皇后就在可选棋格内摆放,再删掉所有永久不能摆放的棋格。这样是否可行呢?
-
广谱化 = 让计算机做更多。当我们广谱化问题后,就会遇到计算机迭代试错的次数增加。但如果我们指定规则,选择从第一行开始摆起,一行行的遍历,默认每一行都只能放一个皇后,判断下一行是否能摆放,放不完8个皇后就回到能放的分支再往下进行选择。——>这就是DFS回溯算法了。
算法的重要性
作为一个小白,到这里明白算法的重要性了。这些总总算法,都是前人走通的路子,这些路子,就是尽量减少了人脑局限,但又能给计算机以一定的规则的方法。如果要从小白自己总结,不知道又要花多少时间。
在网上买了一些算法的书籍,后面博客更新可能会慢很多,因为要扎进算法学习的海洋。
因为我在网上找到的题目,大多数是来自于力扣(https://leetcode-cn.com/),专门去看了,有答题框架,像玩游戏通关一样。听说目前中文版和英文版已经打通,里面有很多算法题可以刷。在本博客系统中曾有大神一年内就通过刷题从小白成为了Microsoft的员工。既然是要付年费,那就等我算法书看完,再去刷题啦。
和各位小白共勉,也向各位大神致敬
老熊去也。