크기가 n 인 항목 l의 목록이 주어지고 i2
이 i1
이면 성공하는 술어 succeeds(i1,i2)
이 주어지면 l의 모든 항목 i에 대해 succeeds(i,i.next)
이 true를 반환하도록 l의 요소를 다시 정렬하는 가장 좋은 알고리즘은 무엇입니까?연속되는 요소가 서로 이어 지도록 목록의 요소를 재정렬 하시겠습니까?
답변
각 요소 다음에 하나의 요소 만 성공할 수있는 경우이 문제는 2 차 시간에 해결할 수 있습니다.
실제로 데이터에서 연결된 목록을 만들어 배열로 반환하는 것을 모방합니다. 병목 현상은 각 요소 (요소를 따르는 요소)를 찾는 것입니다.
의사 코드 : 각 요소를 성공할 수있는 요소의 수에는 제한이없는 경우
specialSort(array,n)
create an array a of size n
for each i from 0 to n:
find j such that succeeds(array[i],array[j]) == true //this may require linear search, so it is O(n)
if there is such j:
a[i] = j
else:
a[i] = -1
end for
find i such that for any j: a[j] != i
create empty result array of size n
j = 0;
while (i != -1):
result[j++] = array[i]
i = a[i]
end while
return result
, 당신에게 준 @templatrtypedef 대답은 정확하고 문제는 해밀턴을 찾는 것과 같습니다 통로.
편집 : 그런 다음, 각 요소에 대해 두 개 이상의 후속하지만 관계 succeed()
이있을 수있는 경우도 [NO "루프"] 정렬되지 않도록
참고 :이 문제는 잘 정렬 된 관계에 대한 solveable입니다 이 문제로부터 각각 DAG을 만들 수 있습니다. 각 요소는 정점이며, succeed(a,b) == true
과 같은 모든 쌍의 가장자리가 있습니다. topological orderring을 사용하고 그것을 반환하십시오.
병목 목이 가장자리를 찾고 있기 때문에 이것은 또한 2 차 시간입니다.
성공 관계가 될 수있는 것에 대한 제한이 없다면 (즉, 전이, 반사, 대칭 등일 필요는 없습니다),이 문제는 NP- NP- 하드 Hamiltonian path problem. 감소는 실제로 매우 간단합니다 : 그래프 G가 주어지면 그래프에서 노드의 배열을 success 관계로 생성합니다. 그러면 원래 그래프에서 u에서 v까지의 가장자리가있는 경우 v가 성공합니다. 이 설정을 통해 배열 요소 (노드)를 성공 관계 (노드를 연결하는 가장자리)로 정렬하는 방법을 찾는 것은 각 노드를 정확히 한 번 방문하기 때문에 원래 그래프에서 해밀턴 경로를 찾는 것과 같습니다. 결과적으로 P = NP가 아니면 효율적인 알고리즘을 찾을 수 없습니다.
부정적인 결과로 불편을 끼쳐 드려 죄송합니다.
흥미 롭습니다! 그러나 각각의 'i'에 대해 제약 조건을 추가하면 축소가 유지되지 않는다고 생각합니다. {| {j : succeeds (i, j) = true} | == 1' [즉, 하나의 요소 만이 각 요소를 이어받습니다.] 이것은 OP가 실제로 수행 한 것일 수 있습니다. [이 작업이 숙제라는 사실을 간략히 말하면]. 이 경우 (제약 조건이있는 경우) 간단한 BFS/DFS가 원하는 순서 지정을 찾습니다. – amit
- 1. 목록의 요소를 비교하고이를 서로 바꿉니다. Java
- 2. posistion 요소가 서로 붙게합니다.
- 3. iPhone 경고에서 단추를 재정렬 하시겠습니까?
- 4. 목록의 요소를 Title-Case로 변환 하시겠습니까?
- 5. 은 두 목록의 요소를 비교합니다.
- 6. XAML 코드를 재정렬 하시겠습니까?
- 7. 한 목록의 요소를 가리키고 다른 목록의 요소를 표시하는 방법은 무엇입니까?
- 8. 데이터 테이블의 열을 재정렬 하시겠습니까?
- 9. JQuery를 사용하여 특정 클래스가없는 요소를 숨겨 지도록 설정하려면 어떻게해야합니까?
- 10. 연속되는 문자열을 나누는 방법?
- 11. 목록의 모든 요소가 조건과 일치하는지 확인하는 방법?
- 12. PriorityQueue는 이미 큐에있는 요소를 재정렬 할 수 있습니까?
- 13. WPF - 목록의 요소를 반복하십시오.
- 14. 목록의 요소를 추출하는 중
- 15. jQuery로 div 위치를 재정렬 하시겠습니까?
- 16. 프레임 워크의 규칙을 재정렬 하시겠습니까?
- 17. 요소가 다른 유형의 두 목록의 상대적인 보완
- 18. 각 n 번째 요소를 취하는 배열 재정렬
- 19. 재정렬 큐
- 20. 중첩 된 목록의 요소를 결합 - 파이썬 3
- 21. Android : 사용자가 ListView에서 요소를 재정렬 할 수있게하려면 어떻게해야합니까?
- 22. 스윙 구성 요소가 서로 안쪽으로 그려져 있습니다.
- 23. 목록의 특정 요소를 제거하는 방법
- 24. 목록의 모든 요소를 인쇄합니다. C++
- 25. 하스켈에서 목록의 요소를 이동하는 방법?
- 26. 연결된 목록의 모든 요소를 제거하십시오.
- 27. 목록의 모든 요소를 트리밍하려면 어떻게해야합니까?
- 28. .count없이 목록의 각 요소를 계산합니다.
- 29. 목록의 요소를 .csv 파일로 인쇄
- 30. Scheme 목록의 끝에 요소를 추가하십시오.
표준 정렬과 다른 점이 있습니까? 예를 들어,'std :: list :: sort'이 술어로 성공하면? –
'successs' 함수는 그러한 순서가 존재 함을 보장합니까? 그런 주문이 없다면 어떤 결과가 나올까요? 하나 이상이 있다면? – ARRG
@AndrewWalker : 이것은'successs'가 엄격한 weak ordering을 모델링하는 경우에만 작동합니다. –