CLIQUE Algorithm หรือ อัลกอริทึมค้นหาคลิก (Clique) เป็นอัลกอริทึมที่ใช้ในการหากลุ่มย่อยของจุด (vertex) ที่เชื่อมโยงทั้งหมดกันเองในกราฟที่ไม่มีทิศทาง (undirected graph) โดยในภาษาคณิตศาสตร์ คลิกหมายถึงกลุ่มย่อยของกราฟที่ทุกจุดเชื่อมต่อกันทั้งหมด กล่าวคือ หากเรามีกราฟ G และกลุ่มย่อย C ถ้าทุกคู่จุดใน C มีเส้นเชื่อมถึงกันใน G แล้ว C คือคลิกของ G นั่นเอง
CLIQUE Algorithm สามารถใช้แก้ไขปัญหาในหลายด้าน เช่น ในเครือข่ายโซเชียลมีเดียสามารถใช้ CLIQUE ตรวจหากลุ่มของคนที่ต่างก็รู้จักกันทั้งหมด (สมมติในกลุ่มเพื่อนสนิท) หรือในงานวิจัยทางชีวสารสนเทศ สามารถใช้ CLIQUE สำหรับการค้นหาโปรตีนที่มีปฏิสัมพันธ์ซึ่งกันและกันเพื่อวิเคราะห์กลุ่มย่อยทางชีวภาพ
นี่คือตัวอย่างโค้ดในภาษา C++ สำหรับทำความเข้าใจ่านักพัฒนาสามารถสร้างฟังก์ชันที่หา CLIQUE ในกราฟได้อย่างไร:
#include 
#include 
using namespace std;
// ฟังก์ชันสำหรับการตรวจสอบว่าสามารถเพิ่ม vertex ไปยัง clique ปัจจุบันหรือไม่
bool isClique(int k, vector>& graph, vector& clique) {
    for (int i = 0; i < k; i++) {
        if (!graph[clique[i]][clique[k]]) {
            return false; // หากมี vertex ที่ไม่เชื่อมต่อกับ vertex ใน clique ปัจจุบัน
        }
    }
    return true;
}
// ฟังก์ชันหลักสำหรับค้นหาคลิกขนาดใหญ่ที่สุด
void findCliqueRec(int k, vector>& graph, vector& clique, int& max_size, vector& result) {
    int n = graph.size();
    if (k == n) {
        if (clique.size() > max_size) {
            max_size = clique.size();
            result = clique;
        }
        return;
    }
    // ค้นหากับ vertex ต่อไป
    for (int i = k; i < n; i++) {
        if (isClique(k, graph, clique)) { // ตรวจสอบว่าสามารถเพิ่ม vertex ไปยัง clique ปัจจุบันหรือไม่
            clique.push_back(i); // เพิ่ม vertex อันใหม่ลงใน clique ปัจจุบัน
            findCliqueRec(i + 1, graph, clique, max_size, result); // ต่อยอดการค้นหา
            clique.pop_back(); // ลบ vertex ที่เพิ่มเข้าไปหากไม่สามารถเป็นส่วนหนึ่งของ clique ใหญ่สุด
        }
    }
}
vector findClique(vector>& graph) {
    int max_size = 0;
    vector clique, result;
    findCliqueRec(0, graph, clique, max_size, result);
    return result; // คืนค่า clique ที่ใหญ่ที่สุดที่หาได้
}
// ฟังก์ชันหลักสำหรับการทดสอบ
int main() {
    int n = 5; // จำนวน vertices
    vector> graph(n, vector(n, false));
    // เส้นเชื่อมระหว่าง vertices ที่ระบุด้วยค่า true
    // กราฟที่วาดตัวอย่างนี้เป็นรูป 4-clique
    graph[0][1] = graph[1][0] = true;
    graph[0][2] = graph[2][0] = true;
    graph[0][3] = graph[3][0] = true;
    graph[1][2] = graph[2][1] = true;
    graph[1][3] = graph[3][1] = true;
    graph[2][3] = graph[3][2] = true;
    vector clique = findClique(graph);
    // แสดงผลลัพธ์
    cout << "Maximum clique size: " << clique.size() << endl;
    cout << "Vertices in the maximum clique: ";
    for(int v : clique) cout << v << " ";
    cout << endl;
    return 0;
}
             โปรดทราบว่าอัลกอริทึมนี้ค่อนข้างง่ายและสำหรับเพียงแค่การสาธิต อัลกอริทึมนี้อาจไม่ได้เหมาะสมกับกราฟขนาดใหญ่เนื่องจากมีประสิทธิภาพที่อาจหยุดชั่วคราวได้
การวิเคราะห์ความซับซ้อนของอัลกอริทึม CLIQUE นั้นเกี่ยวข้องโดยตรงกับขนาดของกราฟและจำนวนคลิกที่อาจเกิดขึ้น ในกรณีแย่ที่สุด (Worst-Case Scenario) ความซับซ้อนของเวลาสำหรับอัลกอริทึมนี้คือ O(n * 2^n) ซึ่ง n คือจำนวน vertices ในกราฟ นั่นหมายความว่าเมื่อขนาดกราฟเพิ่มขึ้น การคำนวณที่ต้องใช้ในการค้นหาคลิกจะเพิ่มขึ้นแบบเรขาคณิตทางด้านเวลา
ข้อดี
1. สามารถหาคลิกขนาดใหญ่ที่สุดในกราฟได้เป็นอย่างดี
2. เหมาะสำหรับกราฟขนาดเล็กถึงขนาดกลาง
ข้อเสีย
1. เมื่อกราฟมีขนาดใหญ่และซับซ้อนมากขึ้น การคำนวณก็จะใช้เวลานานมากขึ้นเช่นกัน
2. อัลกอริทึมมีความซับซ้อนทางเวลาสูง (High time complexity) ในกรณีแย่ที่สุด
CLIQUE Algorithm เป็นเครื่องมือที่มีค่าในการวิเคราะห์และการหากลุ่มในกราฟ แต่การใช้งานของมันควรพิจารณาตามบริบทและขนาดของข้อมูลที่นักวิเคราะห์มีอยู่ และหากคุณสนใจที่จะเรียนรู้อัลกอริทึมนี้อย่างลึกซึ้งเพิ่มเติม พวกเราที่ Expert-Programming-Tutor (EPT) พร้อมที่จะสอนและแนะนำในทุกขั้นตอน ไม่ว่าคุณจะต้องการพัฒนาทักษะเขียนโปรแกรมในระดับใด สำรองที่นั่งได้เลยวันนี้ และเริ่มต้นการเรียนรู้ของคุณกับเหล่าผู้เชี่ยวชาญที่ EPT!
หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง
Tag ที่น่าสนใจ: clique_algorithm คลิก อัลกอริทึม ค้นหากลุ่มย่อย ภาษา_c++ การโปรแกรม ความสัมพันธ์ กราฟ โค้ด_c++ ความซับซ้อน เวลา ข้อดี ข้อเสีย การวิเคราะห์ บทสรุป
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC) 
    084-88-00-255 (AIS) 
    026-111-618 
    หรือทาง EMAIL:  NTPRINTF@GMAIL.COM
 
    
