2017-11-23 5 views
2

일부 데이터 외에도 다음 레코드의 인덱스를 저장하는 n 열이있는 테이블이 있습니다. 예 :레코드 순서를 복구하십시오.

q)show t:([]x:"cbad";n:3 0 1 4) 
x n 
--- 
c 3 
b 0 
a 1 
d 4 

이 정보에서 레코드 순서를 복구하는 방법을 찾고 있습니다. 올바른 순서 위의 예에서 abcd하고 n 열은 cbab 뒤에, c 뒤에, d 다음 것을 우리에게 알려줍니다, 그리고 d 마지막 기록합니다 (n의 범위 인덱스의 아웃주의입니다 기둥).

q)select x,next_x:x n from t 
x next_x 
-------- 
c d 
b c 
a b 
d 

마지막 레코드는 항상 올바른 위치에 있으며 알고리즘은이를 가정 할 수 있습니다.

[편집]

다음

내가 생각 해낸 한 라이너 :

t exec n\[-1+count i;first i except n]from t 

I :

사무실에서
q)t exec n\[-1+count n;]first where @[(1+count n)#1b;n;:;0b] from t 
x n 
--- 
a 1 
b 0 
c 3 
d 4 

답변

0

누군가가 솔루션의 단순화를 내놓았다 위의 하나보다 훨씬 빠르지 만 다음 숯이 올바른 순서를 얻는 것을 정의하는 사전을 사용합니다 :

{a:-1_r\[key[r]except value r:x[`x]!x[`x]x`n];x a?/:x`x}t 
x n 
--- 
a 1 
b 0 
c 3 
d 4 

감사합니다, 당신이 뭔가를 할 수있는 가정으로
토마스 스미스
AquaQ 분석

+0

나는 내 솔루션을 어느 정도 단순화했으며, 현실적인 테스트 케이스에서 나보다 약 10 % 더 빠릅니다. –

1

:

t exec -2_n\[first i except n] from t 

약 30 %만큼 예를 가속화하고, 조금 더 우아한 내 생각 엔 :-)

매트

+1

스티븐 아 프터 (Stevan Apter)의 기사가 treetables의 벡터에서 꽤 흥미 롭다는 것을 알지 못했다면 (http://archive.vector.org.uk/art10500340) 문제는 저를 생각하게했습니다. –

+0

링크를 제공해 주셔서 감사합니다. 매우 흥미로운. 불행히도, 당신이 더 큰 테스트 케이스에서 당신의 솔루션을 시도했을 때 나는 "루프"오류가 발생했습니다. –

+1

사용중인 테스트 케이스/데이터 세트의 크기는 얼마입니까? –