📜  确定性和非确定性算法之间的差异(1)

📅  最后修改于: 2023-12-03 15:27:18.430000             🧑  作者: Mango

确定性和非确定性算法之间的差异

在计算机科学中,算法通常被分为确定性和非确定性算法两种类型,两者之间有很大的差异。

确定性算法

确定性算法是指,它的执行流程是完全由算法本身决定的,每一次执行都是一样的,最终得到的结果也是唯一的。这种算法常见的有顺序结构、分支结构和循环结构等。

顺序结构算法是一种简单的算法,它的执行流程按照代码编写顺序进行,没有任何条件和判断。

a = 1
b = 2
c = a + b
print(c)

分支结构算法是一种有条件的算法,它的执行流程取决于条件是否成立,如果条件成立则执行一步操作,否则执行另外一步操作。

a = 1
b = 2
if a > b:
    c = a - b
else:
    c = b - a
print(c)

循环结构算法是一种重复执行一定操作的算法,常见的有for和while两种。

for i in range(0, 5):
    print(i)

i = 0
while i < 5:
    print(i)
    i += 1

以上三种算法都是确定性算法,它们执行的流程和得到的结果都是唯一的。

非确定性算法

非确定性算法是指,它的执行有一定的随机性或不确定性,在不同的情况下可能会有不同的结果。这种算法常见的有搜索算法、优化算法等。

搜索算法是一种通过枚举方式来搜索目标的算法,例如广度优先搜索和深度优先搜索,每一次搜索结果都是不确定的。

def search(d, target):
    if d == target:
        return True
    if d > target:
        return False
    return search(d + 1, target) or search(d * 2, target)

print(search(1, 16))

优化算法是一种通过不断迭代来寻求更优解的算法,例如贪心算法和遗传算法,每一次迭代都可能得到不同的结果。

def knapsack(w, v, c):
    n = len(w)
    f = [0] * (c + 1)
    for i in range(n):
        for j in range(c, w[i] - 1, -1):
            f[j] = max(f[j], f[j - w[i]] + v[i])
    return f[c]

w = [2, 3, 4, 5]
v = [3, 4, 5, 6]
c = 8
print(knapsack(w, v, c))

以上两种算法都是非确定性算法,它们执行的流程和得到的结果都是不确定的。

总结

确定性算法和非确定性算法是算法设计中的两种基本思想,二者在执行流程和结果上都存在差异。在实际应用中,根据具体情况选择不同类型的算法可以更好地解决问题。