gpt4 book ai didi

python-3.x - 贪心算法和时间复杂度#2

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:52:06 24 4
gpt4 key购买 nike

我们有一颗正在滴答作响并可能爆炸的炸弹。这个炸弹有 n 个开关,可以向上或向下移动。这些开关的某些组合会触发炸弹,但只有一种组合会使其失效。

我们的任务是将开关从当前位置移动到使炸弹失效的位置,同时不会引爆它。这些开关又大又笨拙,所以我们一次只能移动一个开关。

比方说,我们有 n = 4 个当前位置 ^vvv 的开关。我们需要让他们到达位置 ^v^^。禁止的位置是 vvv^、^vv^、^v^v 和 ^^^v。

a.) 我必须手工绘制它并找到解决任务的最短开关 Action 序列 - 我得到的结果是 4 ...我找到了两个这样的序列,如果我是对的......

b.) 这就是它变得困难的地方 - 编写一个代码来回答上述问题(最短的序列和多少)。代码应该被通用化,以便它可以与其他数量的开关和其他起始、目标和禁止组合一起工作;有针对性和禁止的组合可能有多个,甚至更少。我们唯一确定的是开关只有两个位置。它还应提供所需条件不可用的可能性;在这种情况下,程序当然应该告诉。

c.) 接下来的问题是代码的时间复杂度,但现在我想我就到此为止吧......

我用“0”和“1”代替,因为这样更容易想象。

所以我的方法是一种贪心算法(我认为)- 起始位置,你考虑所有可能的(允许的)位置,你忽略禁止的位置,然后选择位置序列具有的位置与我们的目标序列差异最小。

我尚未编写代码的关键部分,这是我需要帮助的部分。


all_combinations = ['0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011' , '1100', '1101', '1110', '1111']


def distance (position1, position2):
distance = 0
for i in range (len (position1)):
if position1 [i]! = position2 [i]:
distance + = 1
return distance


def allowed_positions (current, all_combinations):
allowed = set ()
for combination and all combinations:
if the distance (current, combination) == 1:
allowed.add (combination)
return allowed


def best_name (current, all_combinations, target):
list = []
for option and permitted_mood (current, all_combinations):
list.append (distance (option, target), option)

最佳答案

手头的任务是在图中寻找最短路径。为此,有一种典型的方法,即广度优先搜索算法 (https://en.wikipedia.org/wiki/Breadth-first_search)。

没有真正需要深入了解这是如何完成的细节,因为它可以在其他地方更详细地阅读,并且比我在 StackOverflow 答案中所做的解释要好得多。

但可能需要解释的是您手头的开关组合是如何用图表表示的。

假设您只有两个开关。然后你就有了这张图:

^^---^v
| |
| |
v^---vv

如果你的起始位置是^^,结束(化解)位置是vv,而^v位置是爆炸位置,然后你的图表被简化为:

^^   ^v
|
|
v^---vv

在这个小例子中,最短路径显而易见且简单。

手头的图形很容易以二维方式绘制出来,每个维度(x 和 y)代表一个开关。如果您有更多开关,则只需为每个开关添加一个维度。对于三个开关,这看起来像这样:

^^^--------^^v
|\ |\
| \ | \
| \ | \
| \ | \
| ^v^--- | --^vv
| | | |
| | | |
v^^--------v^v |
\ | \ |
\ | \ |
\ | \ |
\| \|
vv^--------vvv

如果位置 ^^vv^^vv^ 被禁止,则此图将简化为:

^^^        ^^v
\
\
\
\
^v^--------^vv
|
|
v^^ v^v |
\ |
\ |
\ |
\|
vv^ vvv

它已经显示出清晰的路径,广度优先搜索将很容易找到它。不过,它只对许多维度/开关变得有趣。

为更多维度/开关绘制此图当然会令人困惑(查找 4D 超立方体)。但不一定要有视觉图像。一旦您编写了以通用方式在 2D 和 3D 中创建图形的算法,它就可以轻松扩展到 n 维/开关,而不会增加任何复杂性。

关于python-3.x - 贪心算法和时间复杂度#2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56367356/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com