小编Noc*_*cta的帖子

这种实现合并排序好吗?

我刚刚开始学习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)

sorting merge mergesort haskell

7
推荐指数
1
解决办法
612
查看次数

为什么要使用new和delete?

我是C++的新手,我想知道为什么我甚至不愿意使用新的和删除?它可能导致问题(内存泄漏),我不明白为什么我不应该只是在没有new运算符的情况下初始化变量.有人可以向我解释一下吗?这个具体问题很难谷歌.

c++ memory-management delete-operator

6
推荐指数
2
解决办法
2894
查看次数

为什么 A* 比 Dijkstra 快

我知道已经有人问过这个问题,但它没有回答我的具体问题。我了解 Dijkstra 算法和 A* 算法的工作原理,并且 A* 是 Dijkstra 的一般情况。

通常说 A* 可以更快地找到解决方案,这在您使用加速过程/减少有效分支因子的启发式方法时是有意义的。

但我记得,要使 A* 返回最佳结果,您必须搜索成本低于目标成本的所有节点。这确保了最优性,而且据说不可能有更快的算法,因为 A* 着眼于所有节点 <= 目标成本,每个算法至少必须这样做。

但是迪杰斯特拉呢?它也只消耗节点 <= 目标成本,因为它在每一步都扩展了最小可能的路径。

如果您无论如何都必须扩展其他节点以确保最优性,那么 A* 启发式算法有什么用?此外,这两种算法似乎都有 n log n 的运行时复杂度

希望有人能解决这个问题:)

graph-theory a-star dijkstra

1
推荐指数
1
解决办法
2320
查看次数