python⽤户路径分析_最低成本路径分析(Python)
python⽤户路径分析
多维数组和矩阵是编程技术⾯试中的热门⾯试主题。 尽管此类问题的实际应⽤有时可能会花很多时间,但此类问题确实测试了受访者使⽤不同数据类型的能⼒以及将代码整合为简洁块的能⼒。 我最喜欢这个⼩组中的⼀个问题,它涉及最低成本的途径。
以地图和道路为⽹格格式的上述⽰例为例。 如果您试图从A点到达B点,那么您可能会想到距离或时间上的每条街道。 因此,根据您从A点到B点的路线,您旅⾏的时间和⾏进的距离可能会有所不同。 使事情变得复杂的是,如果每条道路都是⼀条单向的街道,那么如果您发现所选路线上有很多⼈流,您将⽆法向后⾏驶。 在此⽰例中,确定最⼩成本路径将需要检查每条航路的距离或时间值,并计算将为您提供最⼩总和值的路线。
这与这些技术访谈中经常问到的最低成本路径问题背后的想法⾮常相似。 将上⾯的⽰例转换为看起来更熟悉的⽰例,请考虑以下⽰例:
python获取数组长度
您通常会看到类似地图的内容,⽽不是地图。 数字⽹格。 作为开发⼈员,我们的⼯作是到从左上⽅到右下⽅的路径,这将为我们提供最⼩的成本路径或最⼩路径总和。 通常,我们只能选择相邻的数字,并且只能沿向下或向右移动⽹格。 这可能是这样的:
如果在此⽰例中,我们选择了⼀条使我们直⾛然后再向下⾛的路径,则将在该路径上相加每个值,从⽽使总路径成本为2707。但是,最⼩成本路径可能会⼩得多。 让我们看另⼀个简化的⽰例:
在此视觉效果中,我减⼩了每个数字的值,并为每个⽹格值指定了参考点。 例如,第⼀个⽹格项可以由
坐标(a,v)引⽤。 这将帮助我们确定所引⽤的值。 当我们从伪代码转换为实代码时,我们可能会使⽤⼀个数组,并且可以通过索引来引⽤值。
在此⽰例中,很明显,由于总路径有限,我们可能只需⼏分钟即可计算出最⼩路径。 但是,想象⼀下20 x 20甚⾄100 x 100的⽹格。即使使⽤程序,可能路径的数量也会很快变得太⼤⽽⽆法计算。 即使我们可以使⽤蛮⼒来确定每个路径的值并进⾏⽐较来确定最⼩路径,此
类操作通常也会占⽤⼤量内存,并且效率远远低于其他⽅法。 让我们使⽤这个简单的⽰例查看更有效的⽅法来确定最⼩成本路径。
⾸先,我们将查看⽹格中的第⼀⾏和第⼀列。 请记住,我们只能向右或向下移动到最终值。 在这⾥,我已经更新了第⼀⾏和第⼀列中的新值,并给出了给出该值的⽅程式。 在第⼀⾏中,我们通过将当前⽹格值的值与前⼀个⽹格块的值相加来获得新值。 在第⼀列中,我们通过
将当前值添加到该块上⽅的块的值来获得该块的新值。
现在,我们对块(b,w)做⼀些不同的操作。 因为它的上⽅和左侧都有⼀个块,所以我们可以添加其中⼀个块。 由于我们需要最终的最⼩成本路径,因此选择较⼩值的块是有意义的。 在这种情况下,它是值为3的块(a,w)。更新后的值为7(3 + 4)。 现在,让我们在当前
⾏中做同样的事情:
的块的值较⼩,我们将使⽤该总和作为更新值。 让我们⽤更新的值填充⽹格的其余部分。
通过在每个块上加上所有最⼩总和,我们的结尾块的值为18。如果我们向后追溯路径,则可以确认18确实是我们的最⼩成本总和。 现在,在这个⼩例⼦上,这似乎有些琐碎,但请再次想象⼀下这种⽅法有多容易,尤其是当我们的数字更⼤或⽹格具有更多值时。 更不⽤说,此⽅法⽐计算和⽐较每个可能的路径要有效得多。
现在,让我们看⼀下如何将其转换为实际代码。 我的⽬标不是编写可以解决此问题的硬编码脚本,⽽是编写可以解决任何⼤⼩的⽹格的函数。 为了测试程序,我将从之前的⽹格开始,但是在这⾥,我将其转换为单个数组:
arr = [131, 673, 234, 103, 18, 201, 96, 342, 965, 150, 630, 803,
746, 422, 111, 537, 699, 497, 121, 956, 805, 732, 524, 37, 331]
接下来,我将定义⼀些变量。 这些变量对于以后能够在不同⼤⼩的⽹格上重⽤此精确代码⾮常重要。
rows = 5
columns = 5
length = len(arr)
l = range(length)
firstColumn = l[5::rows]
firstRow = range(1, columns)
rows变量定义此⽹格具有的⾏数。 我的数组中有25个数字,但是我可以按⾏和列将其分解。 这将帮助我保持井井有条。 columns变量执⾏相同的操作。 现在,如果我有⼀个不同的数组(例如100或1000个数字),则可以更改⾏和列变量,以根据数组长度反映新⽹格将具有的新⾏和列数量。
我的长度变量将帮助我设置以下变量。 由于第⼀⾏和第⼀列的数学与所有其他⽹格块都不相同,因此我将⽆法分别选择它们,⽽知道数组的长度将有助于我做到这⼀点。
我定义了firstColumn变量。 由于变量“ l”现在是⼀个列表,其中包含代表数组长度的数字范围,因此我正在使⽤该范围来确定此变量。在此⽰例中,由于我有5⾏,所以我想要的索引值为5、10、15和20。这将构成我的第⼀列。 l[5::rows]基本上从列表开始,从5开始,跳过数字并获取每第5个后续值,从⽽为我提供了所需的索引。 如果以后使⽤更⼤的⽹格,则可能以不同的值启动它,具体取决于⾏和列的⼤
⼩。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论