我有一个带有 pairs 的列表[[1, 2], [2, 1], [1, 3] ..]
。如何以最快的方式获得独特的配对?我写了一个函数,但是太慢了。
-module(test).
-export([unique/1, unique/2, pairs/1]).
unique(L) -> unique(L, []).
unique([], UL) -> UL;
% L: list of lists
unique(L, UL) ->
[X,Y] = hd(L),
case lists:member([Y,X], L) of
true ->
unique(L--[[Y,X]], [[X,Y]|UL]);
false ->
unique(tl(L), UL)
end.
pairs(L) -> [[X,Y] || X <- L, Y <- L, X=/=Y].
从外壳,
1> test:pairs([1,2,3]).
[[1,2],[1,3],[2,1],[2,3],[3,1],[3,2]]
2> test:unique(test:pairs)). %Very slow for large list. How to improve?
[[2,3],[1,3],[1,2]]
我有一个列表长度9900
的对列表,其中一半是重复的。我正在使用对列表进行进一步计算。对于原始列表(具有重复对),时间是3.718s
,如果我过滤掉唯一列表并使用 if 进行计算,时间7.375s
会更糟。
我将功能更改为不使用--
运算符。
unique(L, UL) ->
[X,Y] = hd(L),
case lists:member([Y,X], L) of
true ->
unique(tl(L), [[Y,X]|UL]);
false ->
unique(tl(L), UL)
end.
即便如此,它仅对 进行了0.047s
改进7.375s
,这表明该算法不够快。
你能指出任何更好的算法吗?有没有为此的内置库函数?
谢谢。