【发布时间】:2017-06-16 14:30:43
【问题描述】:
我有 x,y 坐标和 char 元素的数组。我需要函数来获取指定坐标方向上的 n 个字符列表。我用循环的方式写的:
import Data.Array
exampleArray = array ((1,1),(2,2)) [((1,1),'a'), ((1,2),'b'), ((2,1),'c'), ((2,2),'d')]
-- 1 2
-- +---+---+
-- 1 | a | b |
-- +---+---+
-- 2 | c | d |
-- +---+---+
f :: Array (Int, Int) Char -> Int -> (Int, Int) -> (Int, Int) -> [Char]
f _ 0 _ _ = []
f arr n (x,y) (dirX, dirY) = (arr ! (y,x)) : f arr (n-1) (x+dirX,y+dirY) (dirX, dirY)
-- ac
list = f exampleArray 2 (1,1) (0,1) -- get 2 chars from array at 1,1 toward E
-- cb
list2 = f exampleArray 2 (1,2) (1,(-1)) -- get 2 chars from array at 1,2 toward NE
它可以工作,但它太慢了,我想知道如何优化它?
【问题讨论】:
-
您可以使用如下原语重新设计:
f arr n s (dx, dy) = take n . map (arr!) . iterate (\(!y, !x) -> (y + dy, x + dx)) . swap $ s。你能写出你的代码运行速度太慢的真正简单的例子吗? -
我收到
Illegal bang-pattern (use BangPatterns): ! y -
我无法提供简单的示例,但请考虑在 gomoku AI 中搜索数千个数组中的模式。如果您修复功能,我将提供两个功能之间的时间差。
-
使用扩展名
BangPatterns避免编译错误。 -
获得最佳移动需要 17 秒,而使用您的函数则需要 18 秒。
标签: haskell