Замените бесконечности нулями, а затем заполните их, используя заливки в q kdb - PullRequest
1 голос
/ 07 июня 2019

Я проходил объяснение заливки и наткнулся на приведенный ниже пример: то есть, если есть бесконечности, замените их нулями, а затем заполните их, используя заливки.

q)fills {(x where x=0W):0N;x} 0N 2 3 0W 0N 7 0W
Output - 0N 2 3 3 3 7 7

Я хочу еще больше расширить эту проблему, еслипервое значение в выводе - Null, затем заполните его значением по умолчанию 1, для которого я написал две версии решения.

{(x where x=0N):1;x} fills {(x where x=0W):0N;x} 0N 2 3 0W 0N 20 30 0W
1^fills {(x where x=0W):0N;x} 0N 2 3 0W 0N 20 30 0W /- Output - 1 2 3 3 3 20 30 30

Какая из двух является оптимизированной версией (я думаю, что это вторая версия с использованием fill)?
Какая-нибудь лучшая / оптимизированная версия?

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Добавление 1 к бесконечности превращает его в ноль

q)0W 10 0N+1
0N 11 0N

Чтобы сохранить значения orig и null, давайте вычтем 1 из результирующего списка

q)-1+0W 10 0N+1
0N 10 0N

Заполнения могут принимать два параметра (начальная цифра как x, если вы задаете два параметра)

q)fills 0N 10 20 0N 40
0N 10 20 20 40
q)fills[33;] 0N 10 20 0N 40
33 10 20 20 40

Так что в целом это соответствует вашим требованиям

q)fills[1;] -1+x+1
1 2 3 3 3 20 30 30 30 2 3 3 3 20 30 30 30 2 3 3 3 20 30 30 30 2 3 3 3 20 30 3..

НТН, Шон

1 голос
/ 07 июня 2019

Вы всегда можете проверить решения, выбрав их для большого вектора

q)\ts {(x where x=0N):1;x} fills {(x where x=0W):0N;x}10000000#0N 2 3 0W 0N 20 30 0W
196 553649552

q)\ts 1^fills {(x where x=0W):0N;x}10000000#0N 2 3 0W 0N 20 30 0W
190 553649216

Для больших векторов вы должны получить небольшое улучшение, заполнив только первый элемент 1, предполагая, что это единственный, который вам нужен по умолчанию

q)@[;0;1^]fills {(x where x=0W):0N;x}0N 2 3 0W 0N 20 30 0W
1 2 3 3 3 20 30 30

Однако, если у вас есть последовательность нулей в начале (а не только одна), это не поможет

q)@[;0;1^]fills {(x where x=0W):0N;x}0N 0N 2 3 0W 0N 20 30 0W
1 0N 2 3 3 3 20 30 30

В этом случае вам лучше пойти с 1^ на весь вектор

...