算法思考

本文探讨了算法的本质,指出所有编程算法都是暴力求解的变体,旨在减少不必要的计算。文章通过比较传统算法与编程算法,强调了减少计算次数的重要性。作者还讨论了线性问题的现实意义,解释了为什么线性系统在现实世界中更常见,并分析了线程池控制、多线程排序和哈希冲突的概率。此外,文章提出了动态规划和贪心算法的空间时间转换,并对字符串匹配和一维匹配问题提出了改进思路。
摘要由CSDN通过智能技术生成

写在前面

在学习了这么多的视觉算法控制算法和编程算法之后,对整个算法体系有了一些感想,在这里记录一下。

算法是什么

很多人学习了很多算法,却根本不知道算法的本质是什么?但是深入说起来,这其实是一个哲学问题。
有些书说算法是帮主我们解决问题的方法。但是问题是怎么来的呢?没错,问题也是人提出来的,用人设计的算法去解决人提出来的问题,就意味着一个前提条件,即问题所在的空间内要包含问题的解。
接下来是传统算法和编程算法的区别,首先我把视觉统计控制什么之类的算法都归为传统算法,他们与编程算法最本质的区别就是,他们的解域都是无穷大的,编程算法是一定可以把所有可能结果都列出来的。
比如,我们要找int 1-10内最大的数,可能的结果只有1,2,3,4,5,6,7,8,9,10,那么直接挨个作比较就可以找到是10最大。
而现实中,我们要找1-10内最大的数,就没办法找到了,9.9是最大的吗?9.99比它还大,一直找下去可以找到9.99999…有人说直接取10不就是最大的,但我们怎么知道比10大的数不存在呢?在这里因为限制条件很简单,所以我们知道10在限制条件中是最大的输出了,但如果很复杂呢?我们只能通过求出精确解(解析解或数值解)来得到最大值,而不是把所有可能结果都遍历出来,挨个比较得到最大值。在数学上,一般求解这类问题用最优化,列一个方程f(x)=x,1<=x<=10。求导,在限制条件内找最大值,又由于方程是线性的,可以直接用线性规划。
所以,所有的编程算法本质上都是暴力求解(遍历),包括所有的排序,查找(其实排序和查找本质上是一样的),动态规划,剪枝,尺规,回溯等等等等都是基于暴力求解。注意这里蒙特卡洛,贪心算法,信息熵增益等算法并不属于编程算法,如果已经看懂了的朋友应该自然就能理解。
既然都是暴力求解,那提出这么多编程算法到底是为了干啥?
因为暴力求解时间复杂度太高,往往成指数增长,计算机性能开耗不起。而算法就是通过某种方法,来减少暴力求解的次数。
凭什么能减少?
从信息的角度来说,一坨数据包含的信息是非常丰富的,但对某个问题来说,并不是所有的信息都有用,如果我们能够剔除掉这些无用信息,只保留有用的,那么获取信息的成本就会大大减少。如果我们把一个问题分为无数个子问题来看的话,那么子问题也剔除无用信息在某些情景下会表现为不重复利用已有信息。
从逻辑的角度来说,对当前问题来说,很多工作被重复进行了。
实际举例:
a,b,c三个数排序,已知a<b,之后又计算出了b<c,那么还需要计算a<c吗?
对排序问题来说,在知道a<b和b<c之后,a和c的关系就已知了,再进行比较是无意义且重复的。
减少次数的代价是什么?(以下为个人民科,不看也罢)
我们知道物质和能量是可互换的,不能凭空减少也不能凭空增多。
在信息领域也是如此,信息在时间上的量和在空间上的量总数是一定的,只能从时间量转换为空间量,或从空间量转换为时间量。
也就是说我们算法节省出来的时间,必然要花费一定的空间来弥补回来,不可能存在时间和空间双赢的算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值