我正在寻找算法的名称(以及代码:在PL/SQL或PG/SQL中),该算法正在找到一个集合的所有夫妇(2-Uplets)。
示例:A -B -C结果 :1:A -B2:A -C3:b -c
我知道Powerset算法可以完成这一工作的一部分,但是我正在寻找一个优化的夫妇查找器算法。
powerset PG/SQL算法的链接:https://www.postgresql.org/message-id/20060924054759.ga71934@Winnie.fuhr.org
您是否考虑过
之类的东西Select A.x, B.x
From YourTable as A, YourTable as B
Where A.key <> B.key
您提到SQL,因此这可能是可取的。请注意,跨产品中的行数与对数的数量大致相同,因此效率并不高。
我已经构建了解决方案:
CREATE OR REPLACE FUNCTION twouplets(a anyarray)
RETURNS SETOF anyarray AS
$BODY$
DECLARE
retval a%TYPE;
size integer := array_upper(a, 1);
i integer;
j integer;
BEGIN
i := 0;
j := 1;
FOR i IN 1 .. size LOOP
FOR j IN 1 .. size-i LOOP
retval := '{}';
retval := array_append(retval, a[i]);
retval := array_append(retval, a[i+j]);
RETURN NEXT retval;
END LOOP;
END LOOP;
RETURN;
END;
$BODY$
LANGUAGE plpgsql IMMUTABLE STRICT
COST 100
ROWS 1000;
ALTER FUNCTION twouplets(anyarray)
OWNER TO postgres;