校友网站 建设,php个人网站源码,网站建设在作用是什么,做网站出现的常见问题曾经有一个著名的骗局#xff1a;小明是一个赌马爱好者#xff0c;最近他连续几次提前收到了预测赌马结果的邮件#xff0c;从一开始由于不屑而错失良机#xff0c;到渐渐深信不疑#xff0c;直到最后给邮件发送方汇了巨款才发现上当。看过这个的人应该知道#xff0c;骗… 曾经有一个著名的骗局小明是一个赌马爱好者最近他连续几次提前收到了预测赌马结果的邮件从一开始由于不屑而错失良机到渐渐深信不疑直到最后给邮件发送方汇了巨款才发现上当。看过这个的人应该知道骗子收集到一份邮件信息后分组发送不同预测结果的邮件赌马结果公布后再将筛选出来的那部分人分组继续发送下一轮预测邮件。几轮过后肯定能保证一部分人收到的预测结果是完全正确的。这也是最关键的部分。那么骗子是如何从几万或几十万用户中寻找这些“幸运儿”的呢这是一种二分法的思想。假如要顺序在100万人中寻找一个人最多需要100万次而二分法只需要18次。下面讲讲一些能够解决生活中一些具体问题的常用算法。二分查找对于一个长度为N的数组简单查找最多需要N步二分查找最多只需要logN步约定底数为2。二分查找相较于简单查找极大地提高了效率但是二分查找的前提是列表是有序的这也导致了诸多限制。快速排序DCDC(divide and conquer)分而治之是一种重要的解决问题思路。当面对问题束手无策时我们应该考虑一下分而治之可以解决吗现在有一个问题假如一块土地1680*640需要均匀地分为正方形而且正方形的边长要尽量的大。该怎么分这个问题本质就是求两条边长的最大公因数。可以使用欧几里得算法辗转相除快速排序快速排序是一种常用的排序算法比选择排序快得多O(n^2),快速排序也使用了DC。选择基准值将数组分成两个子数组基准值左边的数组和基准值右边的数组对这两个数组进行快速排序快速排序的最糟情况是O(n^2),O(n^2)已经很慢了为什么还要叫它快速排序呢?快速排序的平均运行时间为Onlogn,而合并排序的时间总是Onlogn合并排序似乎更有优势那为什么不用合并排序呢因为大O表示法中的n是一个常量当两种算法的时间复杂度不一样时即使n在数值上不同对总时间的影响很小所以通常不考虑。但有些时候常量的影响很大对快速排序和合并排序就是这样快速排序的常量小得多所以当这两种算法的时间复杂度都为Onlogn时快速排序要快得多。而相较于最糟的情况快速排序遇上平均情况的可能性更大所以可以稍稍忽视这个问题。快速排序最糟的情况下调用栈为O(n),在最佳情况下调用栈长O(logn)散列表使用散列函数和数组可以构建散列表散列表是包含额外逻辑的数据结构。但是要编写出完美的散列函数几乎不可能假如给两个键分配的空间相同的话就会出现冲突。如何处理冲突呢?最简单的办法是假如在某一空间上产生冲突就在这一空间后再加上一个链表。但是假如这个链表很长会很影响查找的速度链表只能顺序查找查找时间为O(n)所以一个能尽量避免冲突的散列函数是多么重要那么怎么编写一个性能较高的散列表呢较低的填装因子一旦填装因子大于0.7就需要调整长度良好的散列函数让数组中的值呈均匀分布可以了解下SHA函数广度优先搜索广度优先搜索能够解决两个问题两个节点之间是否存在相连的路径最短的距离是多少这个“最短距离”的含义有很多种。想象这么一个问题你想在你的微信好友和好友的好友中寻找是否有人是一名消防员该如何查找并且尽可能这人和你的关系更近些。迪克斯特拉算法在图中搜索最小的“段”数可以用广度优先算法这就相当于默认每条边的权重是相同的如果每条边的权重不同呢那就需要用到迪克斯特拉算法。概括来说迪克斯特拉算法就是从起点开始首先寻找最廉价的节点更新其开销并标记为已处理然然后在未处理的节点中寻找开销最小的节点然后以此往复下去。针对书中的这样一个问题我把题干提取出来目标是用乐谱换钢琴。现在乐谱可以免费换海报海报加30元换吉他海报加35元换架子鼓乐谱加5元可以换唱片唱片加15元换吉他唱片加20元换架子鼓吉他加20元换钢琴架子鼓加10元换钢琴。现在我用图把这个关系表示出来可以看出这是一个加权图现在我们要使用迪克斯特拉算法寻找最短路径。最后的最低开销表为节点开销海报0唱片5吉他20鼓25钢琴35父子节点表为父节点子节点乐谱唱片乐谱海报唱片吉他唱片鼓鼓钢琴可以看出最优的交换的路径为piano-drum-record-music最低开销为35元贝尔曼-福德算法在迪克特拉斯算法的基础上我们考虑这样一种情况假如边的权重存在负值。在迪克特拉斯算法中我们首先寻找最廉价的节点更新其开销再寻找未处理节点中最廉价的节点以此往复。可能出现这样一个情况在将海报标记为已处理后开始处理唱片但是唱片到海报的路径使得海报的开销更小又将更新海报的开销但是海报已经标记为已处理。那么就会出现一些问题。假如继续使用迪克特拉斯算法最后的结果肯定是错的大家可以更改参数试一下。为了正确解决问题这时需要使用贝尔曼-福德算法。贪心算法对于一些比较复杂的问题使用一些算法不能简单有效地解决这时候往往会使用贪心算法每步操作都选择局部最优解最终得到的往往就是全局最优解。这似乎是想当然的做法但是很多情况下真的行之有效。当然贪心算法不适用于所有场景但是他简单高效。因为很多情况并不需要追求完美只要能找到大致解决问题的办法就行了。假如我们面对这么一个问题假设我开了一家网店在全国各省都有生意现在面临发快递的问题假设现在的基础物流不是很完善每家快运公司只能覆盖很少几个省那么我该如何在覆盖全国34个省级行政区的情况下选择最少的快运公司这个问题看似不难其实很复杂。现在假设有n家快运公司那么全部的组合有2^n种可能。N2^N101024201048576501125899906842624可以看到假如有50家快递公司我将要考虑1125千亿种可能。可以看到没有算法能很快的计算出这个问题那么我们可以使用贪心算法求局部最优解然后将最终得到的视为全局最优解。那么在这个问题下如何使用贪心算法核心在于什么是局部最优条件可以这样选择一家覆盖了最多未覆盖省的公司。重复第一步。来源果核里的图灵版权归原作者所有转载仅供学习使用不用于任何商业用途如有侵权请留言联系删除感谢合作。数据与算法之美用数据解决不可能长按扫码关注