:(){ :|:& };:
最近在和知乎上认识的几位小伙伴( @lokinko 、 @雪峰的自由之路 ......)一起讨论leetcode,在此期间,我遇到了下面这样一个题目:
这类题目,可以是暴力递归。但是乍一看的话,肯定优先考虑用动态规划来做了。
不过,Discussion 里给出了一个答案是这样的:
class Solution: def stoneGame(self, piles: List[int]) -> bool: return True
测试了一下发现确实没毛病:
如果这是凑巧的话,那我没话说。如果说是回答者做出了数学优化而自信满满地给出return True这行代码的话,那可以说是对题目的降维打击了。
相比于传统的DP动态规划解的另一种方法——博弈先手优势的数学归纳解法。
于我而言这也算是一种暴力美学吧,程序员的头脑风暴(逃 ε=ε=ε=┏(゜ロ゜;)┛
我大学室友,用安卓做一个成语接龙的手机游戏,是毕业设计。
直到有一天,我看到他的源码:if(answer ==‘为所欲为'){}else if(answer =='为虎作伥') *n
这样的代码,他写了接近1000多行。。
最后还过了。。
//更新:
大家都纠结java用==的事,本人现在在用js写前端,只是看了这个问题想起大学的一些趣事,才写的这个答案,所以也没有多想,至于这些细节我也不会记得这么清楚,大家意会到就好了。
注:java用equal比较字符串。
很酷炫吧?
这玩意儿搞出的某些东西,甚至能盖过某些“古风”党几条街去(反正我是半点看不上那些玩意儿:当然,这个纯属个人观点)。
让机器吟诗作对?风雅到骨子里了吧?
但事实上,这才是个充满“暴力美学”的、通过简单粗暴的工程思维拼凑出来的、黑大傻粗的玩意儿……
它的基本原理,只是统计所有存世对联里“B词出现在A词之后的概率”和“下联中在A词对应位置上出现B词的概率”(所谓“马尔科夫模型”),然后在你给出上联/标题后,用“蒙特卡罗”方法选择一些词,然后从中挑出一句“构成对联的概率最大”的而已——所谓“蒙特卡罗方法”,其实还是“在所有词中随机选一个”,同样的简单粗暴。
(当然,这是最“糙”的未打磨版的做法——不过“打磨版”也没高到哪儿去,无非是加一些统计再加一些判断罢了)
这帮粗鲁的家伙!硬生生用理科生的简单粗暴闯进了文学殿堂!
PS:感谢 @张昭 朋友提示,目前对联/诗词也开始迁移到基于神经网络的Seq2seq方法上去了——而神经网络是另外一种简单粗暴的思路,后文会有提及。
不仅这个。之前中文分词一直是个难题,多少学者搞了半辈子都没有丝毫眉目。
(“中文分词”这个问题是这么来的:英文单词前后有空格,所以无需分词;但中文是一个个字直接“拼”成了一句话,想正确理解它,就得把组成这句话的一个个词“摘”出来。比如“日文章鱼怎么说?”得先拆分成“日文 章鱼 怎么 说 ”,才有办法继续分析下去;但如何让电脑知道,这句话不能拆分成“日 文章 鱼 怎么 说”呢?这就是分词算法遭遇的极大难题)
过去,学者们尝试通过分析语法、词性、语义等手段来解决分词问题——这也正是我们人类自己理解一句话的思路——然而写成算法效果一直不好,完全无法实用。
后来,中文分词得到了突破性进展。
这个研究是google搞的,同样基于马尔科夫链原理:先统计海量文章,找出B词在A词后的概率;然后找C词出现在B词后的概率……
最终,算法目标就变成了“找出一种分词方案,使得这种方案里的一系列词按顺序最终组成一句话的概率最大”。
简单粗暴吧?
但™真把老大难的分词问题给解决了——而且只需二阶马尔科夫链,就足以达到实用标准了(二阶就是只统计到“B在A后面出现的概率是多少”,而三阶就要统计到“当B在A后面出现的时候,后面再出现C的概率是多少”:没想到吧?这种简单粗暴的玩法,居然能比精妙的各种语法/语义分析强大得多!)。
(当然,之后又在这个基础上有了很多别的进展,我不搞这个,就不乱说了)
这个思路用在输入法的“智能联想提示”以及“整句输入”上,效果也是呱呱叫——当年的google输入法就是因为这个算法一举成名,打的在这个领域浸淫了多年的其它拼音输入法公司晕头转向……
这个算法甚至可以自动识别出网友新造词——原理也很简单,找几个字同时出现的概率,如果它们经常同时出现,那么这很可能就是一个词(当然会有一定的误识别,主要集中在“的”“了”等高频字上;这同样可以利用统计方法去除);如果这个词不存在于旧词库,那么它就可能是一个新造词。
——现在,知道输入法的“新词库”“新网络流行语”是怎么找出来的了吧?才不是雇一群人天天泡各大论坛呢~~
事实上,去年大出风头的alpha go/alpha zero,也是个典型的“暴力美学”产物。
这玩意儿是这么来的:生物学家发现,神经细胞像一个触手怪一样,会“张牙舞爪”的伸出很多“触手”和其它神经细胞相互链接。而这些“触手”(术语叫轴突)可以传递信号(神经冲动)。
有人就猜想,或许这就是我们学习/思考的原理吧:
1、我们听到、看到、摸到的各种信号,最终成为某种“神经冲动”进入神经中枢
2、中枢的某个神经元收到信号,就通过“触手”告诉和它相连的其它神经元
3、经过很多神经元的传递后,信号最终被识别出来,并可能因此产生某种决策
4、决策的结果有好(达到目的)有坏(未达到目的甚至造成伤害)
5、根据结果好坏,奖励或者惩罚相关联的细胞
进一步抽象:
1、每个神经元负责接受外界输入,然后传给其它神经元
2、当奖惩信号到来时,每个神经元找出那些让自己做出正确判断的神经元,增大它的权值;同时找出使自己做出错误判断的神经元,降低它的权值
更进一步:
1、用函数模拟神经元
2、把函数分成若干组,第一组接受输入,然后产生信号传递给第二组;第二组以第一组的输入为输入,输出信号给第三组,依次类推
3、根据结果正确与否,每组函数检查导致自己输出正确/错误的那些上层函数,提高/降低它给自己的信息的权值
嗯,然后只要函数个数够多、层次够深、训练次数足够,大概就能解决学习问题了吧。
然后,让我们把图片数字化,然后丢给这么一堆函数,让它们输出一个值(0~1之间)试试效果吧。
我们可以规定这个值的意义是“图片中有猫的概率”,0就是绝对没猫,1是肯定有猫,0.8就是八成有猫——然后再人工识别图片是否有猫,也把人工识别的结论表示成数字。
最后,让这组函数学习一堆图片;每学完一张,就根据人工识别的结果完成奖惩。
如此反复,经过大量图片训练之后,这组函数竟然真的知道什么是“猫”了。
类似的,我们还可以让它判断围棋落子位置的好坏,然后用最后的输赢来给它打分——经过数千万局的训练,它就真的赢了李世石、柯洁!
类似的,这玩意儿还可以用来搞出准确率极高的语音识别、人脸识别,可以完成照片到水彩到油画的转换,甚至把输入照片仿造成著名画家的作画风格……
这东西如今真是炙手可热。你能想到的几乎任何地方,都会有人尝试塞个神经网络碰碰运气……
但这玩意儿为什么能做到这些?
没人知道。
反正,只要我们想办法堆叠尽量多的“函数”,组成尽量庞大的人工神经网络,然后想办法把问题对应过去,最后搞一堆数据训练它——这玩意儿往往就真的能比最强的人类做的还要好。
这还真是大力出奇迹。
while( TryDoSomething() == false );
我觉得大家对暴力的理解有点儿偏差,简单的东西才能叫做暴力,写那么大一堆,写的时间比计算机跑的时间还长哪暴力了……
哦。。。我觉得百度1万多个if的“人工智能”无人驾驶汽车项目应该最切这题。
我曾用归并排序和random shuffle 写过一个占用内存超大的死循环。每个寒冷的夜在床上,我都一边开着循环加温一边看视频。
证明:任意组合的三阶魔方,均可在20步之内还原。
This is a great example of brute force. I thought this would be proved by maths, but they just tested all the possible(relevant) cases, I love it.
路人甲:暴力证明的典范!简单粗暴的证明!
Brute force never fails, unless of course you’re not using enough of it.
炮灰乙:没有什么问题是暴力解决不了的!如果有,那就再暴力一点!
据传,三阶魔方有约合4.3千兆种不同的可能组合状态[注1]。就算是每秒钟能转出十种不同组合的神级玩家,想要尝试所有的组合,也要花1500亿年的时间才能如愿 (作为比较,我们的宇宙目前还不到 140 亿岁)。
因此,“三阶魔方的最小还原步数”也被称为“上帝之数”。在此之后的三十多年中,数学家们通过多次助攻一步步收窄上帝之数的范围。
然而最后,人头被谷歌旧金山总部的超级主脑计算机抢走[注2]。下面是由计算机模拟出的每种步数对应的状态总数,同时也证明了三阶魔方的上帝之数是20。
最后是一些小注释~
1.计算三阶魔方可能的组合状态总数
另外,如果你拆解并还原过魔方,会出现以下3种情况:
所以只有 的可能性可以直接还原魔方。
即三阶魔方可能的组合状态总数为
2.遍历所有组合状态的步骤
参考资料:
有一说一,其实性价比最高的4K蓝光播放设备很可能是二手xbox
“所以你看到了我的消息还是没回对吗?”
“是”