읽기 전용 스택을 사용하여 정렬


14

다음 설정을 고려하십시오.

  • 우리는 스택 주어진다 s 포함 n 항목을.
  • 상수 O(1) 개의 추가 스택을 사용할 수 있습니다 .
  • 이러한 스택에 다음 작업을 적용 할 수 있습니다.
    1. 스택이 비어 있는지 확인하십시오.
    2. 두 스택의 최상위 항목을 비교하고
    3. 스택에서 최상위 항목을 삭제하고
    4. 상단 항목을 스택으로 인쇄하고
    5. 스택의 최상위 항목을 다른 스택에 복사
    6. 한 스택의 내용을 다른 스택으로 복사합니다.

이것 만이 허용되는 작업입니다. 항목을 교체 할 수 없으며 최상위 항목을 스택으로 복사하는 것을 제외하고는 스택으로 항목을 푸시 할 수 없습니다 (그 후에 대상 스택의 이전 내용이 삭제되고 복사 된 항목 만 포함됨) .

다음은 스택을 O(n2) 비교 로 정렬하는 알고리즘입니다 .

last := empty
for i from 1 to n
  min := empty
  w := s
  while w is not empty
    if w.top > last and w.top < min
      min := w.top
    delete w.top
  print min
  last := min

더 잘할 수 있을까요?

O(nlogn) 비교 만 사용하여 스택에서 항목의 정렬 된 목록을 인쇄하는 프로그램이 있습니까?


2
레지스터가 스택처럼 동작하는 것 같습니까? 푸시 및 팝 작업에 대해 이야기하는 것 같습니다. 그게 당신의 질문입니까? 여러 스택과 스택 작업을 사용하여 스택을 어떻게 정렬 하시겠습니까?
AturSams

2
레지스터를 사용하면 다음을 수행 할 수 있습니다. 모든 레지스터를 하나의 레지스터 ( O ( n ) )에 넣고 일반적인 정렬 알고리즘 ( O ( n lg n ) )을 적용하십시오. nO(n)O(nlgn)
Kaveh

1
당신이 사용 하시겠습니까 레지스터를? 그렇지 않으면 Kaveh의 의견에 따라 문제가 심각해집니다. O(1)
Yuval Filmus

1
아니에요. 나는 우리가 단지 하나의 스택이 아니라 많은 스택을받는다고 생각했다. 나는 그것을 고칠 것이다.
Kaveh February

2
@akappa, 당신은이보고에 사용할 수 있습니까? 1보다 큰 임의의 크기 손실을 유지할 수 없습니다. 정렬 된 블록을 저장할 필요가 없습니까?
Kaveh

답변:


1

나는 이제 사소한 하한을 보여줄 수 있다고 생각합니다. 아이디어는 비교 분기 프로그램 제품군으로 그러한 프로그램을 구현하는 것입니다. 작은 프로그램의 사용을 분기 우리의 가족, 즉한다는 '읽기 전용'가정 수단 , 공간. 그런 다음 Borodin 등이 증명 한 하한 S T = Ω ( n 2 ) 을 적용합니다 . "명백하지 않은 컴퓨터에서 정렬하기위한 시공간 트레이드 오프" 이것은 우리에게 시간 동안 n 2 / log n 하한을 제공합니다.O(logn)ST=Ω(n2)n2/logn

좀 더 자세하게 설명하자면, 우리는 위의 작업 5를 생략 할 수 있습니다. 느슨하게 말해서, 만약 우리가 이미 두리스트의 헤드를 비교하고리스트의 헤드를 인쇄 할 수 있다면,리스트의 헤드를 특정 레지스터에서 분리 할 필요가 없습니다. 이것을 가정하면, 머신의 모든 레지스터는 입력의 마지막 부분 문자열 만 저장한다는 것을 알 수 있습니다.

레지스터 프로그램에 줄의 코드와 k 개의 레지스터 X 1 , , X k 가 있다고 가정합니다 .kX1,,Xk

수정 하십시오 . 길이 n의 문자열에 대한 비교 분기 프로그램을 다음과 같이 구성합니다. 각 튜플 노드 생성 ( I , D (1) , ... , D K ) 1 I 0 D (1) , ... , D KN . 아이디어는 레지스터 시스템의 계산이 분기 프로그램의 경로에 해당하며 노드 ( i , d 1 , , d에 있음)입니다.nn(i,d1,,dk)1i0d1,,dkn 레지스터 머신에서 i 행에 있고 X i에 저장된 문자열의 길이는 d i 입니다. 이제 분기 프로그램의 방향 모서리를 정의해야합니다(i,d1,,dk)iXidi

행 이 양식 인 경우i

만약 다음 고토 I를 1 다른 오도 I를 2Xu<Xvi1i2

그런 다음 모든 에 대해 노드 ( i , d 1 , , d k ) 는 입력 의 d u- th 및 d v- th 요소를 비교 하고 "true"에지가 ( i 1 , d 1 , , d k ) 및 "false"모서리는 ( i 2 , d 1 , , d kd1,,dk(i,d1,,dk)dudv(i1,d1,,dk) .(i2,d1,,dk)

행 이 양식 인 경우i

, Goto line i 'X1tail(X2)i

다음 노드에서 화살표가 행은 ( I ' , D 2 - 1 , ... , D (K) ) .(i,d1,,dk)(i,d21,,dk)

행 이 양식 인 경우i

print(head(Xu)), goto line i

then there is an arrow from any node (i,d1,,dk) to (i,d1,,dk) which is labelled by the du-th node of the input.

nkO(logn)


0

당신은 요소를 셀 수 있습니까? 그런 다음 Mergesort 구현이 상당히 쉽다고 생각합니다. 스택에 추가 기호를 넣을 수 있다면 다음과 같이 3 개의 스택으로 해결할 수 있습니다.

If we have only one element, the list is already sorted. Now assume we have already sorted the top half of the stack. We can copy the top half (in reverse order) to the second stack and place a separation symbol on top of it. Now we have again 3 Stacks (since we can ignore the already sorted symbols below the separation symbol) and can sort the lower half. Finally we can copy the sorted lower half to a third stack in reverse order and merge both halfs back to the original stack.

All operations cost linear time, therefore we have sorted the list in O(nlogn)

(Note, that we need stacks of size nlogn because of the separation symbols, but this can be easily corrected by using another stack)


스택에 새 요소를 넣을 수 없으므로 분리 지점에서 문제가 발생할 수 있습니다. 이를 해결하기 위해 몇 가지 추가 스택으로 다음을 수행 할 수 있습니다.

상단을 복사 2로그요소를 추가 스택에 추가 한 다음 이전과 같이 나머지 요소를 진행합니다. 이제 각 단계에서 고려해야 할 요소의 수를 정확히 알고 있으므로 분리 기호가 필요하지 않습니다.

마지막으로 추가 요소를 최대한 사용하여 절차를 반복하십시오. 로그선형 시간으로 원래 스택에 병합합니다. 일부 상수에 대한 스택 비용 정렬, 많으면 cnlogn+cn2logn2+cn4logn4+ ...=O(nlogn) time, while merging costs an additional O(nlogn).


I'm not sure I understand. How can we, for example, copy the top half on the stack in reverse order onto another stack when we can never push any element onto any stack?
Siddharth

We can not push any new element to a stack, but according to 5 we are able to push the top element of one stack to another. So copying the stack in reverse order requires at most linear time. So I suppose, that was not what you were asking for?
cero

You can't push anything on top of other items as explained in the question.
Kaveh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.