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

การค้นหาค่ามัธยฐานในรายการลิงก์ที่เรียงลำดับใน C ++


ในปัญหานี้ เราได้รับรายการที่เชื่อมโยงที่เรียงลำดับซึ่งประกอบด้วยองค์ประกอบ N งานของเราคือ ค้นหาค่ามัธยฐานในรายการที่เชื่อมโยงที่เรียงลำดับแล้ว .

จัดเรียงรายการเชื่อมโยง เป็นรายการที่เชื่อมโยงอย่างง่ายซึ่งองค์ประกอบทั้งหมดจะถูกจัดเรียงตามลำดับเฉพาะ ตัวอย่าง − 4 -> 6 -> 7 -> 9 -> NULL

ค่ามัธยฐาน เป็นองค์ประกอบกลางของรายการที่เชื่อมโยง หาได้เหมือนกับว่า N เป็นเลขคี่ :ค่ามัธยฐานคือ (n/2) th องค์ประกอบ

ถ้า N เป็นคู่ −s มัธยฐานคือค่าเฉลี่ยของ (n/2) th องค์ประกอบและ (n/2 + 1) th ธาตุ

มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน

Input: 2 -> 3 -> 4 -> 6 -> 9 -> NULL
Output: 4

แนวทางการแก้ปัญหา

วิธีแก้ปัญหาอย่างง่ายคือการนับองค์ประกอบทั้งหมดของรายการที่เชื่อมโยงโดยข้ามผ่านมัน

ตอนนี้ หากการนับเป็นเลขคี่ เราจะสำรวจรายการที่เชื่อมโยงอีกครั้งจนถึงองค์ประกอบ N/2 ของรายการที่เชื่อมโยง

หากการนับเป็นเลขคู่ เราจะสำรวจจนถึงองค์ประกอบที่ N/2 และองค์ประกอบที่ N/2 + 1 บวกเข้าด้วยกันแล้วหารด้วย 2

แนวทางอื่น

อีกแนวทางหนึ่งในการแก้ปัญหาคือการสำรวจรายการที่เชื่อมโยงโดยใช้การข้ามผ่านตัวชี้สองตัวและค้นหาการนับองค์ประกอบของรายการที่เชื่อมโยง

นี่คืออัลกอริทึมในการค้นหาค่ามัธยฐานโดยไม่นับจำนวนองค์ประกอบ พวกมันคือพอยน์เตอร์สองตัวพอยน์เตอร์1 และพอยน์เตอร์2 ตามเงื่อนไขที่เราสามารถมีได้

หากตัวชี้ 1 ไม่ใช่ค่า NULL แสดงว่าตัวชี้ 2 มีค่ามัธยฐาน

ถ้า pointer1 เป็น NULL ดังนั้น (ก่อนหน้าของโหนดของ pointer2 + pointer2 -> data)/2.

ตัวอย่าง

โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา

#include <bits/stdc++.h>
using namespace std;
struct Node {
   int data;
   struct Node* next;
};
void findMedianValue(Node* head){
   Node* ptr1 = head;
   Node* ptr2 = head;
   Node* prev = head;
   if (head != NULL) {
      while (ptr2 != NULL && ptr2->next != NULL) {
         ptr2 = ptr2->next->next;
         prev = ptr1;
         ptr1 = ptr1->next;
      }
      if (ptr2 != NULL)
         cout<<ptr1->data;
      else
         cout<<float(ptr1->data + prev->data) / 2;
   }
}
void pushVal(struct Node** head_ref, int new_data){
   Node* new_node = new Node;
   new_node->data = new_data;
   new_node->next = (*head_ref);
   (*head_ref) = new_node;
}
int main(){
   struct Node* head = NULL;
   pushVal(&head, 3);
   pushVal(&head, 5);
   pushVal(&head, 6);
   pushVal(&head, 8);
   pushVal(&head, 9);
   pushVal(&head, 11);
   cout<<"The median of the linked list is ";
   findMedianValue(head);
   return 0;
}

ผลลัพธ์

The median of the linked list is 7