algorithm - 在线性时间内找到两个排序列表中的公共(public)元素

标签 algorithm language-agnostic f#

我有一个排序的输入列表:

let x = [2; 4; 6; 8; 8; 10; 12]
let y = [-8; -7; 2; 2; 3; 4; 4; 8; 8; 8;]

我想编写一个行为类似于 SQL INNER JOIN 的函数。换句话说,我想返回 x 和 y 的笛卡尔积,它只包含两个列表中共享的项目:

join(x, y) = [2; 2; 4; 4; 8; 8; 8; 8; 8; 8]

我写了一个简单的版本如下:

let join x y =
    [for x' in x do
        for y' in y do
            yield (x', y')]
    |> List.choose (fun (x, y) -> if x = y then Some x else None)

它有效,但它在 O(x.length * y.length) 中运行。由于我的两个列表都已排序,我认为可以在 O(min(x.length, y.length)) 中获得我想要的结果。

如何在线性时间内找到两个排序列表中的共同元素?

最佳答案

我无法在 F# 方面为您提供帮助,但基本思想是使用两个索引,每个索引一个。在该列表的当前索引处选择每个列表中的项目。如果这两个项目的值相同,则将该值添加到结果集中并递增两个索引。如果项目具有不同的值,则仅增加包含两个值中较小值的列表的索引。重复比较,直到你的一个列表为空,然后返回结果集。

关于algorithm - 在线性时间内找到两个排序列表中的公共(public)元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1479297/

相关文章:

c++ - 在 c++ 中创建带循环的间隔并确定没有数组的最小值和最大值

html - 你能提供解析 HTML 的例子吗?

haskell - 什么叫拆分列表的函数?

f# - F# 中的增量值

c++ - 从类函数更改 int 值

algorithm - 将正多边形打包成正方形

algorithm - 我必须找到包含数字 k 或可被 k 整除的第 n 个数字。 (2 <= k <= 9)

regex - 无确定化的 NFA 最小化

parsing - 手动解析左递归文法的最简单方法是什么?

database - 是否计划像在 F# 中那样为 Scala 的 SIQ (ScalaIntegratedQuery) 支持 "type providers"?