Соотношение «многие ко многим» между ключом и значениями в словаре в kdb - PullRequest
0 голосов
/ 17 октября 2019

Недавно я столкнулся с вопросом:
Что если у нас есть организационная иерархия, как показано ниже:

"B" reports to "A" / Hence A is boss of B, C, D, E
"C" and "D" reports to "B" / B is the boss of C, D, E
"E" reports to "D" / D is the boss of E
"G" reports to "F" / separate hierarchy - F is the boss of G

Здесь отношение может быть косвенным, то есть "A" и "C" связаны как "C "сообщает" B ", а" B "сообщает" A ".

Теперь напишите функцию в q, которая принимает 2 аргумента в качестве входных данных и возвращает истину, если оба аргумента связаны или иначе возвращают ложь (например, «A» и «F» не связаны).

Из обоих аргументов любой из аргументов может быть подчиненным или начальным.

Ниже код работает нормально, когда первый аргумент является начальным, а второй подчиненным.

f:{[i1;i2]
    d:(`A`B`D`F)!(`B;[`C`D];`E;`G);
    if[i2 in except[ raze {d[x]}\[i1];`];:1b] / Condition when i1 is boss and i2 is subordinate
    e:(value d)!key d; / dictionary to support if first arg is subordinate and second is boss
    :$[i2 in except[raze {e[x]}\[i1];`];1b;0b]; 
    }

PASS - f[`A;`E] /- output 1b --> 1st arg - boss, 2nd arg - subordinate
PASS - f[`G;`F] /- output 1b --> 1st arg - subordinate, 2nd arg - boss
PASS - f[`F;`A] /- output 0b --> as A and F are not related
FAIL - f[`C;`A] /- output 0b --> fails because dictionary e in function f does not have key `C but `C`D

Может кто-нибудь помочь, пожалуйстаЯ улучшил эту функцию так, чтобы:
1. Функция работала как для начальника, так и для подчиненного, как любая аргумент.
2. Оптимизация - Как можно удалить избыточное создание словаря e и если условие?

1 Ответ

2 голосов
/ 17 октября 2019
q)//dict of subordinate to boss
q)d:`B`C`D`E`G!`A`B`B`D`F
q)//func g 
q)g:{x in'flip {d@x}\[y]}
q)f:{$[0>type x;first;(::)] any 2 0N# g[x,y;y,x]}
q)f[`A;`E]
1b
q)f[`G;`F]
1b
q)f[`F;`A]
0b
q)f[`C;`A]
1b
q)f[`E;`A]
1b
q)f[`A`G`F`C`E;`E`F`A`A`A]
11011b

* правка - векторизация

...