빠른 목록 조작 및 주문 쿼리를위한 데이터 구조가 있습니까?


9

세트가 있습니다 L집합의 요소 목록 N={1,2,3,...,n}. 각 요소N 단일 목록에 나타납니다 L. 다음 업데이트를 수행 할 수있는 데이터 구조를 찾고 있습니다.

  1. concat(x,y) : 포함하는 목록을 연결 y 를 포함하는 목록의 끝에 x

  2. split(x) :를 포함하는 목록을 분할합니다 x 바로 후 x

또한 다음 쿼리를 수행해야합니다.

  1. follows(x,y) : 반환 true 만약 xy 같은 목록에 있고 y 후에 온다 x (그러나 반드시 x)

  2. first(x) :를 포함하는 목록의 첫 번째 요소를 반환합니다. x

  3. next(x) : 다음에 다음 요소를 반환 x 목록에 x

나는 이미 이러한 업데이트를 수행하는 데이터 구조를 생각해 냈습니다. O(lg2(n)) 와 검색어 O(lg(n))시각. 나는 이것을 할 수있는 데이터 구조가 이미 있는지 아닌지에 관심이있다.

동기 부여 : 루트 지정 포리스트는 이러한 목록 집합 중 두 가지로 표현 될 수 있으며 이러한 포리스트에서 도달 가능성을 빠르게 계산할 수 있습니다. 나는 그들이 무엇을 위해 사용할 수 있고이 모든 것이 이미 알려져 있는지 알고 싶습니다.

답변:


11

정수를 건너 뛰기 목록에 유지하십시오. 일반적인 스킵리스트는 키순으로 정렬되지만 시퀀스의 표현으로 사용합니다. 또한 크기의 포인터 배열을 유지하십시오.n. 배열의 각 요소는 건너 뛰기 목록의 노드를 가리켜 야합니다. 나는 이것이 지원한다고 믿는다.nextO(1) 그리고 다른 모든 작업 O(lgn).

구체적으로 특별히:

  • concat또는 split두 개의 건너 뛰기 목록을 사용하면 O(lgn) 시간이 많아서 대부분 무효화됩니다 O(lgn) 포인터.
  • next 리프 레벨에서 앞으로 포인터를 따라 가면 O(1) 시각.
  • first 소요 O(lgn)시간 : 당신이 붙어 때까지 포인터를 따르고, 왼쪽 포인터를 따르십시오. 더 이상 왼쪽 포인터를 따라갈 수 없으면 건너 뛰기 목록의 머리 포인터입니다. 잎에 대한 포인터를 따라 간 다음 하나의 앞으로 포인터를 따릅니다. 이것이 목록의 첫 번째 요소입니다.
  • follows다소 까다 롭습니다. 다음과 같이 진행하십시오first ...에 대한 y, 그러나 붙어있는 값의 목록을 기록하십시오 (즉, 더 이상 포인터를 따라갈 수없는 곳). 이 목록을 "추적"으로 기록합니다. 같은 일을x하지만 왼쪽이 아닌 붙어 있으면 오른쪽 포인터를 따르십시오. 만약x 선행 y, 그들의 흔적이 교차합니다. 흔적의 크기는O(lgn). 트레이스의 각 요소에 멈춤 레벨이 표시되면 시간의 교차점을 확인할 수 있습니다O(lgn).

next 최악의 경우 O(1)다른 모든 사람들은 O(lgn) 높은 확률로 . 결정적인 건너 뛰기 목록을 사용하여 최악의 경우를 만들 수 있습니다.

나는 생각한다 concat 만들 수있다 O(lglgn)잎 수준으로 연결된 (2,5) 나무를 사용하고 등뼈를 강화합니다. 부트 스트랩 트릭에 대해서는 Kaplan 및 Tarjan " 순전히 정렬 가능한 정렬 목록의 기능적 표현 "을 참조하십시오 .


멋있는. 건너 뛰기 목록에 대해 생각하고 있었지만 관련 키 값없이 어떻게 수행 해야하는지 알 수 없었습니다.
Sasho Nikolov

이것은 위대하다. 모든 업데이트를 결정 론적으로 만드는 방법을 봅니다.O(lg(n)), 어느 것이 좋니. O (lg lg (n))를 이해하려면 계속 읽어야합니다. 게시물 @jbapple에 감사드립니다.
bbejot

1

최소 공통 조상 : 문제는 당신은 또한 다음에 관심이있을 것입니다 상상 있도록 동적 뿌리 나무의 접근 가능성 문제를 해결하는 데 사용할 수있는 최적의 알고리즘을 찾기 위해 공통 조상 가장 가까운 동적 나무에 , Alstrup 및 Thorup에 의해. 이 논문은O(n+mloglogn) ...에 대한 n 링크와 m 포인터 머신의 nca 쿼리.


참조 주셔서 감사합니다. 가장 가까운 공통 조상 문제는 확실히 나무의 도달 가능성을 해결합니다. 귀하가 링크 한 논문은O(lglg(n))시각. 완전히 동적 인 나무로 작업 할 수 있는지 궁금합니다.
bbejot
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.