小编Asi*_*san的帖子

尾递归有界整数对(Scala)?

我对Scala很新,所以请原谅我的无知!我正在尝试迭代以最大值为界的整数对.例如,如果最大值为5,则迭代应返回:

(0, 0), (0, 1), ..., (0, 5), (1, 0), ..., (5, 5)
Run Code Online (Sandbox Code Playgroud)

我选择尝试并以递归方式将其作为Stream返回:

    @tailrec
    def _pairs(i: Int, j: Int, maximum: Int): Stream[(Int, Int)] = {
        if (i == maximum && j == maximum) Stream.empty
        else if (j == maximum) (i, j) #:: _pairs(i + 1, 0, maximum)
        else (i, j) #:: _pairs(i, j + 1, maximum)
    }
Run Code Online (Sandbox Code Playgroud)

没有tailrec注释,代码可以工作:

scala> _pairs(0, 0, 5).take(11)
res16: scala.collection.immutable.Stream[(Int, Int)] = Stream((0,0), ?)

scala> _pairs(0, 0, 5).take(11).toList
res17: List[(Int, Int)] = List((0,0), (0,1), (0,2), …
Run Code Online (Sandbox Code Playgroud)

scala tail-recursion tailrecursion-modulo-cons

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

MongoDB:在给定行之前和之后顺序返回行?

在MongoDB中,给定find()运算符返回一组行的游标,这是一种惯用且省时的方式来返回“上下文”行,即按顺序在该组中的每一行之前和/或之后的行?

对我来说,最简单的解释这个概念的方法是使用ack,它支持上下文搜索。给定一个文件:

line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
Run Code Online (Sandbox Code Playgroud)

这是ack的输出:

C:\temp>ack.pl -C 2 "line 4" test.txt
line 2
line 3
line 4
line 5
line 6
Run Code Online (Sandbox Code Playgroud)

我将日志数据存储在MongoDB集合中,每行一个文档。每个日志都将每个标记化为关键字,并对这些关键字进行索引,这使我获得了便宜的全文搜索。

我执行一个沼泽标准:

collection.find({keywords: {'$all': ['key1', 'key2']}}, {}).sort({datetime: -1});
Run Code Online (Sandbox Code Playgroud)

并得到一个光标。在此阶段,不添加任何其他字段,获取上下文的方法是什么?我认为流程是这样的:

  • 对于光标中的每一行:
    • 获取_id字段,存储到x中。
    • 执行:collection.find({_ id:{'$ gt':x}})。limit(N)
      • 从每个游标中获取结果。
    • 执行:collection.find({_ id:{'$ lt':x}})。sort({_ id:1})。limit(N)
      • 从每个游标中获取结果。

对于具有R行的结果集,这需要2R + 1查询。

但是,我认为我可以权衡时间。是否可行的替代方案是在后台用上下文_id更新每一行?对于当前具有字段的给定行:

_id, contents, keywords
Run Code Online (Sandbox Code Playgroud)

我会添加一个附加字段:

_id, contents, keywords, context_ids
Run Code Online (Sandbox Code Playgroud)

然后我可以在随后的搜索中以某种方式使用这些context_ids吗?我对MongoDB MapReduce完全不熟悉,但是那也可以出现吗?

我认为最直接的方法是将实际上下文行的全文存储在每一行中,但这对我来说似乎有点粗糙。明显的优势是,单个查询可以返回我需要的上下文。

我感谢接受问题范围的所有答案。我意识到我可以带外使用Lucene或真正的全文本搜索引擎,但是我想体验一下MongoDB的优势和功能,所以我希望能得到MongoDB特定的答案。谢谢!

database search find mongodb

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