Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Parallel Array ใน C++


อาร์เรย์ขนานเรียกอีกอย่างว่าอาร์เรย์โครงสร้าง

คำจำกัดความ − Parallel Array สามารถกำหนดเป็นหลายอาร์เรย์ที่อิลิเมนต์ ith สัมพันธ์กันอย่างใกล้ชิด และรวมกันเป็นเอนทิตี อาร์เรย์เป็นคุณลักษณะพื้นฐานในภาษา C++ การทำ Parallel Array ช่วยในการเปรียบเทียบอาร์เรย์ตั้งแต่สองตัวขึ้นไป

ตัวอย่างเช่น

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

แนวทางการสร้าง Parallel Array

การค้นหาและการจัดเรียงเป็นคุณสมบัติที่จำเป็นบางประการในการสร้างอาร์เรย์คู่ขนาน

กำลังค้นหา

การค้นหาขึ้นอยู่กับค่าเฉพาะของเอนทิตี ตัวอย่างเช่น เราต้องหาที่อยู่ของบุคคลที่มีความสูงน้อยกว่า 180 ซม. เราจึงค้นหาเกณฑ์ของอาร์เรย์ความสูงที่มีค่าน้อยกว่า 180 สุดท้าย เมื่อได้ผลลัพธ์ เราก็สามารถพิมพ์ออกมาได้

เราสามารถทำตามขั้นตอนเหล่านี้เพื่อทำการค้นหา

  • ค้นหาค่าที่ต้องการในอาร์เรย์ที่เกี่ยวข้อง

  • จัดเก็บดัชนีที่ได้รับค่า

  • พิมพ์ค่า

การเรียงลำดับ

การเรียงลำดับ เราจัดเรียงอาร์เรย์ทั้งหมดด้วยดัชนีและค่าเดียวกัน ตัวอย่างเช่น เราต้องเรียงลำดับดัชนีความสูงจากน้อยไปมาก ดังนั้นเมื่อเราสลับสองความสูง เราก็สลับค่าของพวกมันในอาร์เรย์อื่นด้วย เราสามารถจัดเรียงอาร์เรย์ในรูปแบบตัวเลขหรือตัวอักษรได้

เราต้องทำตามขั้นตอนเหล่านี้เพื่อจัดเรียงอาร์เรย์

  • ค้นหาดัชนีในอาร์เรย์

  • ตอนนี้สลับค่าของดัชนีที่คำนวณได้ 2 ตัวของอาร์เรย์ทั้งหมด

การนำไปใช้

  • รหัสที่กำหนดจะเก็บชื่อ ชื่อที่สอง และส่วนสูง

  • รหัสที่กำหนดจะเก็บชื่อ ชื่อที่สอง และส่วนสูง

  • เราต้องค้นหาชื่อนักเรียนที่สูงเป็นอันดับสอง นักเรียนที่เตี้ยที่สุดเป็นอันดับสาม

จากนั้นนักเรียนมีความสูงเท่ากับ 158 ซม. ในบันทึก

ตัวอย่าง

#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

ข้อดีของ Parallel Array

  • ในบางกรณี พวกเขาสามารถประหยัดพื้นที่จำนวนมากโดยหลีกเลี่ยงปัญหาการจัดตำแหน่ง ตัวอย่างเช่น สถาปัตยกรรมบางตัวจะทำงานได้ดีที่สุดหากจำนวนเต็ม 4 ไบต์ถูกเก็บไว้ที่ตำแหน่งหน่วยความจำที่ทวีคูณของ 4 เสมอ หากฟิลด์ก่อนหน้าเป็นไบต์เดียว อาจทำให้ทิ้งข้อมูลได้ 3 ไบต์ คอมไพเลอร์สมัยใหม่จำนวนมากสามารถหลีกเลี่ยงปัญหาดังกล่าวได้โดยอัตโนมัติ อย่างไรก็ตาม ในอดีต โปรแกรมเมอร์บางคนจะประกาศฟิลด์อย่างชัดเจนโดยลดลำดับของข้อจำกัดในการจัดตำแหน่ง

  • เมื่อจำนวนของรายการในอาร์เรย์มีน้อย ดัชนีอาร์เรย์อาจใช้พื้นที่น้อยกว่าพอยน์เตอร์ทั้งหมด โดยเฉพาะอย่างยิ่งในสถาปัตยกรรมบางอย่าง

  • ตรวจสอบตามลำดับ

  • การตรวจสอบฟิลด์เดียวของแต่ละเร็กคอร์ดในอาร์เรย์ตามลำดับนั้นรวดเร็วในเครื่องที่ทันสมัย ​​เนื่องจากเป็นจำนวนการข้ามผ่านเชิงเส้นของอาร์เรย์เดียวที่มีตำแหน่งอ้างอิงและพฤติกรรมแคชในอุดมคติ

ข้อเสียของ Parallel Array

  • เนื่องจากอาร์เรย์ต่างๆ สามารถจัดเก็บแยกจากกันแบบสุ่มได้ อาร์เรย์เหล่านี้จึงมีจุดอ้างอิงที่แย่กว่าอย่างเห็นได้ชัดเมื่อพยายามเข้าชมระเบียนแบบไม่เรียงลำดับ และตรวจสอบหลายช่องของแต่ละระเบียน

  • พวกเขาปิดบังการเชื่อมต่อระหว่างฟิลด์ต่างๆ ในเร็กคอร์ดเดียว (เช่น ไม่มีข้อมูลที่เกี่ยวข้องกับดัชนีระหว่างฟิลด์เหล่านี้ ซึ่งอาจนำไปใช้ในทางที่ผิด)

  • มีความช่วยเหลือทางภาษาโดยตรงเพียงเล็กน้อย (ภาษาและไวยากรณ์โดยทั่วไปจะไม่แสดงความสัมพันธ์ระหว่างอาร์เรย์ในอาร์เรย์แบบคู่ขนานและไม่สามารถตรวจจับข้อผิดพลาดได้)

  • เนื่องจากการรวบรวมฟิลด์ไม่ใช่ "สิ่งของ" การส่งผ่านข้อมูลจึงใช้เวลานานและเกิดข้อผิดพลาดได้ง่าย ตัวอย่างเช่น ฟังก์ชันต้องยอมรับเขตข้อมูลเป็นอาร์กิวเมนต์ที่แยกจากกัน แทนที่จะเรียกใช้ฟังก์ชันเพื่อดำเนินการกับระเบียนเดียว (หรือโครงสร้างหรือวัตถุ) รายการพารามิเตอร์จำนวนมากต้องเปลี่ยนแปลงเมื่อมีการเพิ่มหรือเปลี่ยนแปลงฟิลด์ใหม่ ในทางตรงกันข้าม การส่งผ่านวัตถุโดยรวมจะหลีกเลี่ยงการเปลี่ยนแปลงดังกล่าวโดยสิ้นเชิง

  • มีค่าใช้จ่ายในการขยายหรือทำสัญญาเนื่องจากต้องจัดสรรอาร์เรย์หลายรายการใหม่ อาร์เรย์หลายระดับสามารถช่วยแก้ปัญหานี้ได้ แต่ส่งผลกระทบต่อประสิทธิภาพเนื่องจากต้องใช้ทางอ้อมเพิ่มเติมเพื่อค้นหาองค์ประกอบที่ต้องการ

บทสรุป

ในบทช่วยสอนนี้ เราได้เรียนรู้วิธีสร้าง Parallel Array พร้อมกับโค้ด c++ เรายังเขียนโค้ดนี้ในภาษาจาวา ไพธอน และภาษาอื่นๆ ได้ด้วย อาร์เรย์เป็นหนึ่งในคุณสมบัติพื้นฐานและมีประโยชน์มากที่สุดของภาษาการเขียนโปรแกรม C++ ใช้เพื่อวัตถุประสงค์ต่างๆ เช่น การเรียงลำดับและการค้นหา เราหวังว่าคุณจะพบว่าบทช่วยสอนนี้มีประโยชน์