【问题标题】:Filtering coordinates tuples (F#)过滤坐标元组 (F#)
【发布时间】:2014-10-15 23:55:07
【问题描述】:

我有一个坐标数组(作为元组),例如:

let A = [|(1,5);(3,3);(4,5);(6,3);(5,1);(2,2)|]

我想删除坐标 (1,5) 和 (5,1)(如果我这样做,我将能够删除 (2,2) 和 (3,3))但我不知道如何要做到这一点。

编辑

详细来说,我想删除所有像“(a,b)”这样的元组,它们在同一个数组中有一个“(b,a)”“相反”元素。 (不知道谁来解释比较好)

【问题讨论】:

  • 你能让关于 (2,2), (3,3) 的部分更清楚吗?我知道有一些关于你想要过滤掉哪些元素的规则,而不是它们是 (1,5) 和 (5,1)。
  • 我这么说是因为在 (1,5) 和 (5,1) 的情况下,规则就像“对于 (a,b) 元组,如果有 (b,a)元组,删除它们。”在 (2,2) 和 (3,3) 的情况下,该规则也适用,因此也应将其删除。

标签: .net arrays f# type-conversion tuples


【解决方案1】:

我很确定这样的事情应该更快。

let hashTuple = function
    | f, s when f > s -> (s, f)
    | f, s -> (f, s)


let filter (a: seq<int*int>) =
    a
    |> Seq.filter (fun (f, s) -> f <> s)
    |> Seq.countBy hashTuple
    |> Seq.filter (fun g -> snd g = 1)
    |> Seq.map fst

【讨论】:

  • 它更快,但还不够快。还是谢谢!
  • 您需要多快?你应该能够并行它。看这里。 fsprojects.github.io/FSharp.Collections.ParallelSeq
  • 我需要将它用于 10k 元组(aprox),并在不到 1 秒的时间内完成所有这些操作。无法安装集合。
  • 我针对 100k 元组运行了上面的代码,它运行良好。不到一秒 10k 应该不是问题。
【解决方案2】:

如果你不介意二次复杂度:

let B = A |> Array.filter (fun (a,b) -> 
    not (A |> Array.exists (fun (a',b') -> a=b' && b=a')))

【讨论】:

  • 是的,这就是我需要的。我希望它支持大量数据。谢谢
  • 嗯,太慢了。有办法优化吗?
  • 你可以尝试使用一个Set:let S = A |> Set.ofArray;让 B = S |> Set.filter (fun (a,b) -> not (S |> Set.exists (fun (a',b') -> a=b' && b=a')))
  • 金德瑞奇是一样的吗?
【解决方案3】:

类似的东西:

let B = A.[1..A.Length-2]

?

【讨论】:

  • 它是如何工作的,为什么仍然存在 (2,2) 和 (3,3) 元组?
  • 它将 B 声明为 A 的子数组,但它忽略了第一个和最后一个元素。
  • 这不是我想要的。我创建 A 就像一个例子。我需要过滤“(a,b)/(b,a)”元组。
猜你喜欢
  • 2013-07-08
  • 2020-04-01
  • 1970-01-01
  • 2016-11-11
  • 2017-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
相关资源
最近更新 更多