LinkedList와 LinkedList의 타당성정렬된 배열과 정렬된 배열정렬되지 않은 데이터?
-
07-07-2019 - |
문제
LinkedList와 배열을 비교하는 동시에 정렬된 데이터와 정렬되지 않은 데이터의 차이점도 비교
- 첨가
- 풀이
- 검색 중
- 정렬
- 전체 속도
- 전체 메모리 사용량
실제 질문
정렬되지 않은 데이터 세트를 배열이 아닌 연결된 목록으로 구현하는 가능성에 대해 논의하세요.삽입, 제거, 검색, 컴퓨터 메모리 및 응용 프로그램 속도 측면에서 장단점은 무엇입니까?
정렬된 데이터 세트를 배열이 아닌 연결된 목록으로 구현하는 가능성에 대해 논의하세요.삽입, 제거, 검색, 컴퓨터 메모리 및 응용 프로그램 속도 측면에서 장단점은 무엇입니까?
이전 질문에 대한 답변을 바탕으로 응용 프로그램에서 연결 목록을 사용할 때의 비용과 이점을 요약하십시오.
내 답변/입력:
LinkedList는 새 노드가 추가될 때마다 메모리를 할당해야 하며, 많은 노드를 추가할 때 유용하며 크기는 계속 변경되지만 일반적으로 요소를 거의 추가할 때 속도가 느려집니다.
프로그램 실행 시작 시 할당된 메모리 배열, 목록 크기 조정 속도 느림(크기 조정이 필요한 경우 많은 요소 추가 속도 느림)
인덱싱으로 인해 배열에서 검색이 더 빠릅니다.
포인터로 인해 LinkedList에서 더 빠르게 추가/제거
해결책
분류되지 않은 대 정렬. 하나도 할게요, 그럼 정말 숙제를해야합니다
StackoverFlow 마크 업에는 실제로 테이블이 필요합니다. 당신은 분류되지 않은/배열, 분류/배열, 미묘한/링크리스트, 정렬/링크리스트에 대한 조작이 얼마나 "비싸다"고 말하고 싶습니다.
마지막 요점 : "응용 프로그램의 속도"는 개별 작업 속도 이상을 고려하는 힌트입니다.
* Adding
분류되지 않은 : 배열 추가는 O (1) 크기를 조정하지 않는 한 O (1)입니다. 끝에 추가하십시오. 오버 헤드를 최소화하는 크기 조정 전략에 대해 논의 할 수 있습니다 (힌트 : 크기를 하나씩 증가시키지 마십시오).
정렬 : 배열 추가는 O (n)입니다 - 추가 할 장소를 찾는 것은 O (log (n))이지만 새로운 것을 위해 ROMM을 만들려면 (평균적으로) 요소의 절반을 움직여야합니다.
Unsorted : 링크 된 목록은 O (1)입니다. 목록의 시작 또는 끝에 추가하십시오.
정렬 : 링크 된 목록은 O (n)입니다. O (1)에 요소를 다시 추가 할 수는 있지만 평균적으로 목록의 절반을 스캔하려면 장소를 찾아야합니다.
그래서 나머지는 당신에게 넘어갑니다. 답을 게시하면 우리는 그것을 비판하지만, (아마도) 비싼 교육에서 최대한 활용하려면, 당신은 정말로 이것에 대해 약간의 일을해야합니다 :)
* Removing
* Retrieving
* Sorting
* Overall speed
* Overall memory usage
다른 팁
이것이 어떤 클래스인지 확실하지 않지만 CS 프로그램의 경우 "느리게"보다 더 잘해야하고 "빠른"것보다 더 잘해야합니다. 수술 수가 필요하다는 점에서 그것을 정량화하십시오. 그러한 정량화에 일반적으로 사용되는 기계에 익숙해야합니다.
Here is a C++ code that illustrates that sorting the data miraculously makes the code faster than the unsorted version. Let’s try out a sample C++ program to understand the problem statement better.
// 프로세싱을 보여주는 CPP 프로그램 // 분류되지 않은 배열의 시간
#include <iostream>
#include <algorithm>
#include <ctime>
using namespace std;
const int N = 100001;
int main()
{
int arr[N];
// Assign random values to array
for (int i=0; i<N; i++)
arr[i] = rand()%N;
// for loop for unsorted array
int count = 0;
double start = clock();
for (int i=0; i<N; i++)
if (arr[i] < N/2)
count++;
double end = clock();
cout << "Time for unsorted array :: "
<< ((end - start)/CLOCKS_PER_SEC)
<< endl;
sort(arr, arr+N);
// for loop for sorted array
count = 0;
start = clock();
for (int i=0; i<N; i++)
if (arr[i] < N/2)
count++;
end = clock();
cout << "Time for sorted array :: "
<< ((end - start)/CLOCKS_PER_SEC)
<< endl;
return 0;
}
// 코드의 출력
Output :
Execution 1:
Time for an unsorted array: 0.00108
Time for a sorted array: 0.00053
Execution 2:
Time for an unsorted array: 0.001101
Time for a sorted array: 0.000593
Execution 3:
Time for an unsorted array: 0.0011
Time for a sorted array: 0.000418
Observe that time taken for processing a sorted array is less as compared to an unsorted array. The reason for this optimization for a sorted array is branch prediction.
@폴:감사해요
- 풀이
정렬되지 않은 것과 정렬된 것:배열 제거는 O(n)입니다. '구멍'을 채우기 위해 모든 요소를 이동해야 합니다.
정렬되지 않은 것과 정렬된 것:연결된 목록은 O(1)입니다. 필요에 따라 포인터를 변경합니다.