我刚刚开始学习Haskell,我之前从未使用过函数式编程语言.我只是想知道合并排序的实现是好还是坏,究竟是好还是坏.也许它甚至是错的 - 它确实排序但是算法可能不是我想的合并排序.
告诉我在这里可以改进的一切.我自己认为它是一个非常清晰和简单的实现.谢谢你的建议,这里是代码:)
merge [] ys = ys
merge xs [] = xs
merge xs ys = sorted : merge left right
where
sorted = if head(xs) < head(ys) then head(xs) else head(ys)
left = if head(xs) <= head(ys) then tail(xs) else xs
right = if head(xs) > head(ys) then tail(ys) else ys
msort [] = []
msort [x] = [x]
msort xs = merge (msort left) (msort right)
where
left = take (div (length xs) 2) xs
right …Run Code Online (Sandbox Code Playgroud) 我是C++的新手,我想知道为什么我甚至不愿意使用新的和删除?它可能导致问题(内存泄漏),我不明白为什么我不应该只是在没有new运算符的情况下初始化变量.有人可以向我解释一下吗?这个具体问题很难谷歌.
我知道已经有人问过这个问题,但它没有回答我的具体问题。我了解 Dijkstra 算法和 A* 算法的工作原理,并且 A* 是 Dijkstra 的一般情况。
通常说 A* 可以更快地找到解决方案,这在您使用加速过程/减少有效分支因子的启发式方法时是有意义的。
但我记得,要使 A* 返回最佳结果,您必须搜索成本低于目标成本的所有节点。这确保了最优性,而且据说不可能有更快的算法,因为 A* 着眼于所有节点 <= 目标成本,每个算法至少必须这样做。
但是迪杰斯特拉呢?它也只消耗节点 <= 目标成本,因为它在每一步都扩展了最小可能的路径。
如果您无论如何都必须扩展其他节点以确保最优性,那么 A* 启发式算法有什么用?此外,这两种算法似乎都有 n log n 的运行时复杂度
希望有人能解决这个问题:)