.net 过滤坐标元组(F#)
我有一个坐标数组(作为元组),如: 我想删除坐标(1,5)和(5,1)(如果我这样做,我将能够删除(2,2)和(3,3)),但我不知道怎么做 编辑 详细地说,我想删除所有元组,比如“(a,b)”,它们在同一数组中有一个“(b,a)”“对立”元素。(我不知道该由谁来更好地解释)诸如此类:.net 过滤坐标元组(F#),.net,arrays,f#,type-conversion,tuples,.net,Arrays,F#,Type Conversion,Tuples,我有一个坐标数组(作为元组),如: 我想删除坐标(1,5)和(5,1)(如果我这样做,我将能够删除(2,2)和(3,3)),但我不知道怎么做 编辑 详细地说,我想删除所有元组,比如“(a,b)”,它们在同一数组中有一个“(b,a)”“对立”元素。(我不知道该由谁来更好地解释)诸如此类: let B = A.[1..A.Length-2] ?诸如此类: let B = A.[1..A.Length-2] ?如果您不介意二次复杂度: let B = A |> Array.filter (f
let B = A.[1..A.Length-2]
?诸如此类:
let B = A.[1..A.Length-2]
?如果您不介意二次复杂度:
let B = A |> Array.filter (fun (a,b) ->
not (A |> Array.exists (fun (a',b') -> a=b' && b=a')))
如果您不介意二次复杂性:
let B = A |> Array.filter (fun (a,b) ->
not (A |> Array.exists (fun (a',b') -> a=b' && b=a')))
我敢肯定像这样的事情会更快
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
让hashTuple=function
|f,s当f>s->(s,f)
|f,s->(f,s)
let过滤器(a:序号)=
A.
|>顺序过滤器(乐趣(f,s)->f s)
|>Seq.countBy哈希元组
|>顺序过滤器(趣味g->snd g=1)
|>序列图fst
我很确定这样的东西应该更快
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
让hashTuple=function
|f,s当f>s->(s,f)
|f,s->(f,s)
let过滤器(a:序号)=
A.
|>顺序过滤器(乐趣(f,s)->f s)
|>Seq.countBy哈希元组
|>顺序过滤器(趣味g->snd g=1)
|>序列图fst
你能把关于(2,2)、(3,3)的部分说得更清楚些吗?我知道有一种规则,你想过滤掉哪些元素,然后是(1,5)和(5,1)。我这么说是因为在(1,5)和(5,1)的情况下,规则就像“对于(a,b)元组,如果有(b,a)元组,就删除它们。”在(2,2)和(3,3)的情况下规则也适用,所以它们也应该被删除。你能把关于(2,2)、(3,3)的那部分说得更清楚些吗?我知道有一种规则,你想过滤掉哪些元素,然后是(1,5)和(5,1)。我这么说是因为在(1,5)和(5,1)的情况下,规则就像“对于(a,b)元组,如果有(b,a)元组,就删除它们。”在(2,2)和(3,3)的情况下这个规则也适用,所以它们也应该被删除。它是如何工作的,为什么还有(2,2)和(3,3)元组?它将B声明为a的子数组,但它忽略了第一个和最后一个元素。这不是我要找的。我创建了一个示例。我需要过滤“(a,b)/(b,a)”元组。它是如何工作的,为什么仍然存在(2,2)和(3,3)元组?它将b声明为a的子数组,但它忽略了第一个和最后一个元素。这不是我要找的。我创建了一个示例。我需要过滤“(a,b)/(b,a)”元组。是的,这就是我需要的。我希望它支持大量的数据。谢谢,太慢了。有没有办法优化它?你可以尝试使用一个集合:让S=a |>Set.of数组;让B=S |>Set.filter(fun(a,B)->not(S |>Set.exists(fun(a',B')->a=B'&&B=a'))是一样的,Jindřich?是的,这就是我需要的。我希望它支持大量的数据。谢谢,太慢了。有没有办法优化它?你可以尝试使用一个集合:让S=a |>Set.of数组;让B=S |>Set.filter(fun(a,B)->not(S |>Set.exists(fun(a',B')->a=B'&&B=a'))是一样的,Jindřich?它更快,但还不够快。无论如何谢谢你!你需要多快?你应该能够将其与之并行。看这里。我需要对10k元组(aprox)使用它,并在不到1秒的时间内完成所有这些操作。无法安装集合。我对10万个元组运行了上面的代码,效果很好。在不到一秒钟的时间内跑10公里应该不是问题。它更快,但还不够快。无论如何谢谢你!你需要多快?你应该能够将其与之并行。看这里。我需要对10k元组(aprox)使用它,并在不到1秒的时间内完成所有这些操作。无法安装集合。我对10万个元组运行了上面的代码,效果很好。在不到一秒钟的时间内跑10公里应该不是问题。