- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 Data.Vector
的 Dog
记录,每个记录都标识了所述狗居住的 House
。我需要一个查找例程来查找住在一个房子里的所有狗,如下所示,但我需要持续时间查找,这是第一个版本无法提供的。
dogs_by_houses dogs h = [ d | d <- Vec.toList dogs, h == house d ]
据我所知,优化 Haskell 代码的核心规则是编译器只计算每个表达式在其封闭的 lambda 表达式中一次。因此,在绑定(bind) h
之前,我必须在 dogs_by_houses dogs
表达式中为这个特定的 dogs
构建一个查找表,是吗?
我认为 Data.Vector
是完成此任务的最佳工具,尽管显然您不能像压缩 C++ 向量那样缩小它们。我将大致按如下方式实现:
dogs_by_houses :: Vec.Vector Dog -> Int -> [Dog]
dogs_by_houses dogs = let {
dog_house = house_id . house ;
v0 = Vec.replicate (maximum . map dog_house $ Vec.toList dogs) [] ;
f v d = let { h = dog_house d } in v // [(h,d:v!h)] ;
dbh = Vec.foldl' f v0 dogs
} in (dbh !)
这里有什么愚蠢的优化吗?我认为像 dbh
这样的变量上的严格标记不会有太大帮助,因为根据定义 dogs
必须在 dbh
有意义之前遍历。
使用 MVector
和 create
而不是折叠返回修改后的不可变向量有什么大的优势吗?到目前为止,我所有使用 MVector
和 create
的尝试都没有那么简洁,do
或 fold (>>)
类似构造或其他任何东西。我认为编译器应该简单地构建 dbh
,即使没有明确给出 MVector
。
这个算法不可能用列表来实现吗?您偶尔会看到人们构建懒惰的无限素数列表,然后使用 primes 选择第 n 个素数! n
.我假设每次以这种方式检索第 n 个素数时都需要遍历列表中的前 n 个素数。相反,我注意到 GHC 将字符串存储为 C 字符串,而不是列表。编译器是否会简单地将已知列表元素表示为一个数组,而不是为每个元素重新遍历列表?
我已经采用 Paul Johnson 和 Louis Wasserman 的答案来构建一个函数来以这种方式对任意向量进行索引,因为我必须基于几个不同的索引函数来这样做。
vector_indexer idx vec = \i -> (Vec.!) t i
where m = maximum $ map idx $ Vec.toList vec
t = Vec.accumulate (flip (:)) (Vec.replicate m [])
$ Vec.map (\v -> (idx v, v)) vec
dogs_by_houses = vector_indexer (house_id . house)
我还没有对此进行分析,但最终。我希望必须编写 my_d_by_h = dogs_by_houses my_dogs
并调用 my_d_by_h
才能从索引中受益。
最佳答案
我曾经在做这样的事情时遇到了一个令人讨厌的陷阱。我使用 Data.Map.Map 作为查找表,但原理是一样的。我的函数获取了一个键值对列表,构造了一个 Map,并返回了查找函数。它是这样的:
makeTable :: [(Key, Value)] -> Key -> Value
makeTable pairs = ((fromList pairs) !)
对我来说很明显我可以写类似的东西
myTable = makeTable [("foo", fooValue), ("bar", barValue) ... and so on]
然后我可以通过说来进行 O(log N) 查找
v = myTable "foo"
然而,GHC 实际上所做的是为每次调用从列表中重建整个 map 。当您以这种方式创建部分应用程序时,GHC 不会尝试找出它可以从其获得的参数中派生出哪些值,它只是存储原始参数并为每次调用执行整个函数。完全合理的行为,但不是我想要的。
我不得不写的是:
makeTable pairs = \k -> table ! k
where table = fromList pairs
我想您将不得不做同样的事情。
关于algorithm - 为查询索引 Haskell 数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9069934/
我在一本书(Interview Question)中读到这个问题,想在这里详细讨论这个问题。请点亮它。 问题如下:- 隐私和匿名化 马萨诸塞州集团保险委员会早在 1990 年代中期就有一个绝妙的主意
我最近接受了一次面试,面试官给了我一些伪代码并提出了相关问题。不幸的是,由于准备不足,我无法回答他的问题。由于时间关系,我无法向他请教该问题的解决方案。如果有人可以指导我并帮助我理解问题,以便我可以改
这是我的代码 public int getDist(Node root, int value) { if (root == null && value !=0) return
就效率而言,Strassen 算法应该停止递归并应用乘法的最佳交叉点是多少? 我知道这与具体的实现和硬件密切相关,但对于一般情况应该有某种指南或某人的一些实验结果。 在网上搜索了一下,问了一些他们认为
我想学习一些关于分布式算法的知识,所以我正在寻找任何书籍推荐。我对理论书籍更感兴趣,因为实现只是个人喜好问题(我可能会使用 erlang(或 c#))。但另一方面,我不想对算法进行原始的数学分析。只是
我想知道你们中有多少人实现了计算机科学的“ classical algorithms ”,例如 Dijkstra's algorithm或现实世界中的数据结构(例如二叉搜索树),而不是学术项目? 当有
我正在解决旧编程竞赛中的一些示例问题。在这个问题中,我们得到了我们有多少调酒师以及他们知道哪些食谱的信息。制作每杯鸡尾酒需要 1 分钟,我们需要使用所有调酒师计算是否可以在 5 分钟内完成订单。 解决
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我开始学习 Nodejs,但我被困在中间的某个地方。我从 npm 安装了一个新库,它是 express -jwt ,它在运行后显示某种错误。附上代码和错误日志,请帮助我! const jwt = re
我有一个证书,其中签名算法显示“sha256rsa”,但指纹算法显示“sha1”。我的证书 SHA1/SHA2 的标识是什么? 谢谢! 最佳答案 TL;TR:签名和指纹是完全不同的东西。对于证书的强度
我目前在我的大学学习数据结构类(class),并且在之前的类(class)中做过一些算法分析,但这是我在之前的类(class)中遇到的最困难的部分。我们现在将在我的数据结构类(class)中学习算法分
有一个由 N 个 1x1 方格组成的区域,并且该区域的所有部分都是相连的(没有任何方格无法到达的方格)。 下面是一些面积的例子。 我想在这个区域中选择一些方块,并且两个相邻的方块不能一起选择(对角接触
我有一些多边形形状的点列表,我想将其包含在我页面上的 Google map 中。 我已经从原始数据中删除了尽可能多的不必要的多边形,现在我剩下大约 12 个,但它们非常详细以至于导致了问题。现在我的文
我目前正在实现 Marching Squares用于计算等高线曲线,我对此处提到的位移位的使用有疑问 Compose the 4 bits at the corners of the cell to
我正在尝试针对给定算法的约束满足问题实现此递归回溯函数: function BACKTRACKING-SEARCH(csp) returns solution/failure return R
是否有包含反函数的库? 作为项目的一部分,我目前正在研究测向算法。我正在使用巴特利特相关性。在 Bartlett 相关性中,我需要将已经是 3 次矩阵乘法(包括 Hermitian 转置)的分子除以作
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
问题的链接是UVA - 1394 : And There Was One . 朴素的算法是扫描整个数组并在每次迭代中标记第 k 个元素并在最后停止:这需要 O(n^2) 时间。 我搜索了一种替代算法并
COM 中创建 GUID 的函数 (CoCreateGUID) 使用“分散唯一性算法”,但我的问题是,它是什么? 谁能解释一下? 最佳答案 一种生成 ID 的方法,该 ID 具有一定的唯一性保证,而不
在做一个项目时我遇到了这个问题,我将在这个问题的实际领域之外重新措辞(我想我可以谈论烟花的口径和形状,但这会使理解更加复杂).我正在寻找一种(可能是近似的)算法来解决它。 我有 n 个不同大小的容器,
我是一名优秀的程序员,十分优秀!