gpt4 book ai didi

performance - 来自列表性能的长度为 n 的子序列

转载 作者:行者123 更新时间:2023-12-04 02:59:48 25 4
gpt4 key购买 nike

我实现了这个答案的一个版本 https://stackoverflow.com/a/9920425/1261166 (我不知道回答者的意图是什么)

sublistofsize 0 _        = [[]]
sublistofsize _ [] = []
sublistofsize n (x : xs) = sublistsThatStartWithX ++ sublistsThatDontStartWithX
where sublistsThatStartWithX = map (x:) $ sublistofsize (n-1) xs
sublistsThatDontStartWithX = sublistofsize n xs

我不确定的是 sublistsThatStartWithX = map (x:) $ sublistofsize (n-1) xs
我认为 map (x:) 给出了一个明智的性能问题,但不确定如何解决它。我已经在 print $ length $ sublistofsize 5 $ primesToTakeFrom 50 上完成了分析
COST CENTRE                                  MODULE                                        no.     entries  %time %alloc   %time %alloc
sublistofsize Main 112 4739871 46.9 39.9 96.9 100.0
sublistofsize.sublistsThatDontStartWithX Main 124 2369935 2.2 0.0 2.2 0.0
sublistofsize.sublistsThatStartWithX Main 116 2369935 47.8 60.1 47.8 60.1

我是否以一种好的方式实现它?
有什么更快的方法吗?

最佳答案

I assume that map (x:) gives a problem performance wise



map被高效编码并在线性时间内运行,这里没有问题。

但是,您的递归可能是一个问题。你们都在打电话 sublistofsize (n-1) xssublistofsize n xs ,其中 - 给定开始列表 sublistofsize m (_:_:ys) - 确实评估术语 sublistofsize (m-1) ys两次,因为在不同的递归步骤中它们之间没有共享。

所以我会应用动态规划来获得
subsequencesOfSize :: Int -> [a] -> [[a]]
subsequencesOfSize n xs = let l = length xs
in if n>l then [] else subsequencesBySize xs !! (l-n)
where
subsequencesBySize [] = [[[]]]
subsequencesBySize (x:xs) = let next = subsequencesBySize xs
in zipWith (++) ([]:next) (map (map (x:)) next ++ [[]])

并不是说附加空列表是最漂亮的解决方案,但是您可以看到我如何使用 zipWith使用置换列表,以便结果来自 next使用两次 - 一次直接在长度为 n 的子序列列表中,一次在长度为 n+1 的子序列列表中。

在 GHCI 中使用 :set +s 对其进行测试,你可以看到这比简单的解决方案快得多:
*Main> length $ subsequencesOfSize 7 [1..25]
480700
(0.25 secs, 74132648 bytes)
(0.28 secs, 73524928 bytes)
(0.30 secs, 73529004 bytes)
*Main> length $ sublistofsize 7 [1..25] -- @Vixen (question)
480700
(3.03 secs, 470779436 bytes)
(3.35 secs, 470602932 bytes)
(3.14 secs, 470747656 bytes)
*Main> length $ sublistofsize' 7 [1..25] -- @Ganesh
480700
(2.00 secs, 193610388 bytes)
(2.00 secs, 193681472 bytes)
*Main> length $ subseq 7 [1..25] -- @user5402
480700
(3.07 secs, 485941092 bytes)
(3.07 secs, 486279608 bytes)

关于performance - 来自列表性能的长度为 n 的子序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21265454/

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