Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 병렬 배열

<시간/>

병렬 배열은 구조체 배열이라고도 합니다.

정의 − 병렬 배열은 i번째 요소가 밀접하게 관련되어 있고 함께 개체를 구성하는 다중 배열로 정의할 수 있습니다. 배열은 C++ 언어의 기본 기능입니다. 병렬 배열을 만들면 두 개 이상의 배열을 비교하는 데 도움이 됩니다.

예를 들어

first_name = ['John', 'Dexter', 'Fredd', 'Hank', 'james']
last_name = ['Jocab', 'Jonas', 'smith', 'lee', 'banner']
height = [160, 148, 231, 153, 162]

병렬 배열을 만드는 방법

검색 및 정렬은 병렬 배열을 형성하는 데 필요한 필수 기능 중 일부입니다.

검색

검색은 엔터티의 특정 값을 기반으로 합니다. 예를 들어 키가 180cm 미만인 사람의 주소를 찾아야 합니다. 그래서 우리는 180보다 작은 값을 가진 height 배열의 기준을 검색합니다. 마지막으로 결과가 나오면 출력할 수 있습니다.

다음 단계에 따라 검색을 수행할 수 있습니다.

  • 해당 배열에서 필요한 값 검색

  • 값을 가져온 인덱스를 저장합니다.

  • 값을 인쇄합니다.

정렬

정렬, 우리는 동일한 인덱스와 값을 가진 모든 배열을 정렬합니다. 예를 들어 높이 인덱스를 오름차순으로 정렬해야 합니다. 따라서 두 개의 높이를 교환할 때 다른 배열의 값도 교환합니다. 숫자 또는 알파벳 순서로 배열을 정렬할 수 있습니다.

배열을 정렬하려면 다음 단계를 따라야 합니다.

  • 배열에서 인덱스를 찾습니다.

  • 이제 모든 배열의 계산된 2개의 인덱스 값을 교환합니다.

구현

  • 주어진 코드는 이름, 두 번째 이름 및 키를 저장합니다.

  • 주어진 코드는 이름, 두 번째 이름 및 키를 저장합니다.

  • 두 번째로 키가 큰 학생, 세 번째로 작은 학생의 이름을 검색해야 합니다.

그러면 학생의 키가 기록에 158cm와 같습니다.

예시

#include <iostream>
using namespace std;
int partition(string first_name[], string
last_name[],
int height[], int low, int high){
   int pivot = height[high]; // pivot
   int i = (low - 1); // Index of smaller element
   for (int j = low; j <= high - 1; j++) {
      if (height[j] <= pivot) {
         i++;
         string temp = first_name[i];
         first_name[i] = first_name[j];
         first_name[j] = temp;
         temp = last_name[i];
         last_name[i] = last_name[j];
         last_name[j] = temp;
         int temp1 = height[i];
         height[i] = height[j];
         height[j] = temp1;
      }
   }
   string temp = first_name[i + 1];
   first_name[i + 1] = first_name[high];
   first_name[high] = temp;
   temp = last_name[i + 1];
   last_name[i + 1] = last_name[high];
   last_name[high] = temp;
   int temp1 = height[i + 1];
   height[i + 1] = height[high];
   height[high] = temp1;
   return (i + 1);
}
void quickSort(string first_name[], string last_name[],
int height[], int low, int high){
   if (low < high) {
      int pi = partition(first_name, last_name, height, low, high);
      quickSort(first_name, last_name, height, low, pi - 1);
      quickSort(first_name, last_name, height, pi + 1, high);
   }
}
void binarySearch(string first_name[], string
last_name[],
int height[], int value, int n){
   int low = 0, high = n - 1;
   int index;
   while (low <= high) {
      index = (high + low) / 2;
      if (height[index] == 158) {
         cout << "Person having height 158"
         " cms is "
         << first_name[index]
         << " " << last_name[index] << endl;
         return;
      }
      else if (height[index] > 158)
         high = index - 1;
      else
         low = index + 1;
   }
   cout << "Sorry, no such person with"
   " height 158 cms";
   cout << "is found in the record";
}
void printParallelArray(string first_name[],
string last_name[], int height[], int n){
   cout << "Name of people in increasing";
   cout << "order of their height: " << endl;
   for (int i = 0; i < n; i++) {
      cout << first_name[i] << " "
      << last_name[i] << " has height "
      << height[i] << " cms\n";
   }
   cout << endl;
}
int main(){
   int n = 4;
   string first_name[] = { "John", "Dexter", "Fredd", "Hank", "james"};
   string last_name[] = { "Jocab", "Jonas", "smith", "lee", "banner"};
   int height[] = {160, 148, 231, 153, 162};
   quickSort(first_name, last_name, height, 0, n - 1);
   printParallelArray(first_name, last_name, height, n);
   cout << "Name of the second tallest person" " is "
   << first_name[n - 2] << " "
   << last_name[n - 2] << endl;
   cout << "Name of the third shortest person is "
   << first_name[2] << " " << last_name[2]
   << endl;
   binarySearch(first_name, last_name, height, 158, n);
   return 0;
}

출력

Name of people in increasingorder of their height:
Dexter Jonas has height 148 cms
Hank lee has height 153 cms
John Jocab has height 160 cms
Fredd smith has height 231 cms

Name of the second tallest person is John Jocab
Name of the third shortest person is John Jocab
Sorry, no such person with height 158 cmsis found in the record

병렬 배열의 장점

  • 어떤 경우에는 정렬 문제를 방지하여 상당한 공간을 절약할 수 있습니다. 예를 들어 일부 아키텍처는 4바이트 정수가 항상 4의 배수인 메모리 위치에 저장되는 경우 가장 잘 작동합니다. 이전 필드가 단일 바이트인 경우 3바이트를 버릴 수 있습니다. 많은 최신 컴파일러는 이러한 문제를 자동으로 피할 수 있습니다. 그러나 과거에는 일부 프로그래머가 정렬 제약 조건의 내림차순으로 필드를 명시적으로 선언했습니다.

  • 배열의 항목 수가 적을 때 배열 인덱스는 특히 일부 아키텍처에서 전체 포인터보다 훨씬 적은 공간을 차지할 수 있습니다.

  • 순서대로 검사

  • 배열에 있는 각 레코드의 단일 필드를 순차적으로 검사하는 것은 참조 및 캐시 동작의 이상적인 위치를 가진 단일 배열의 선형 순회에 해당하기 때문에 최신 시스템에서는 빠릅니다.

병렬 배열의 단점

  • 다양한 배열을 무작위로 멀리 떨어져 저장할 수 있기 때문에 비순차적으로 레코드를 방문하고 각 레코드의 여러 필드를 검사할 때 참조 지역이 훨씬 더 나빠집니다.

  • 단일 레코드의 필드 간 연결을 모호하게 합니다(예:오용될 수 있는 필드 간의 색인과 관련된 정보가 없음).

  • 직접적인 언어 지원이 거의 없습니다(언어와 구문은 일반적으로 병렬 배열의 배열 간에 관계를 나타내지 않으며 오류를 잡을 수 없습니다).

  • 필드를 수집하는 것은 "사물"이 아니므로 전달하는 데 시간이 많이 걸리고 오류가 발생하기 쉽습니다. 예를 들어, 함수는 단일 레코드(또는 구조 또는 개체)에 대해 작동하도록 함수를 호출하는 대신 필드를 별도의 인수로 수락해야 합니다. 많은 매개변수 목록은 새 필드가 추가되거나 변경될 때 변경되어야 합니다. 반대로 개체를 전체적으로 전달하면 이러한 변경을 완전히 피할 수 있습니다.

  • 여러 어레이 각각을 재할당해야 하기 때문에 확장하거나 축소하는 데 비용이 많이 듭니다. 다중 레벨 배열은 이 문제를 해결하는 데 도움이 될 수 있지만 원하는 요소를 찾는 데 필요한 추가 간접 참조로 인해 성능이 저하됩니다.

결론

이 튜토리얼에서는 C++ 코드와 함께 병렬 배열을 만드는 방법을 배웠습니다. 우리는 또한 자바, 파이썬 및 기타 언어로 이 코드를 작성할 수 있습니다. 배열은 C++ 프로그래밍 언어의 기본적이고 가장 유용한 기능 중 하나입니다. 정렬, 검색 등 다양한 용도로 사용됩니다. 이 튜토리얼이 도움이 되기를 바랍니다.