0Pricing
C++ Academy · บทเรียน

ข้อควรพิจารณาด้านประสิทธิภาพ

บักเก็ตและอัตราการโหลด

ข้อควรพิจารณาด้านประสิทธิภาพ เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

วิธีที่ตาราง hash จัดเก็บข้อมูล

คอนเทนเนอร์แบบไม่มีลำดับจะเก็บอาร์เรย์ของ บักเก็ต ไว้ hash ของคีย์จะเลือกบักเก็ต และคีย์หลายตัวในบักเก็ตเดียวกันจะสร้างสายโซ่ที่ค้นหาแบบเชิงเส้น

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<int, int> m{{1, 1}, {2, 2}, {3, 3}};
    std::cout << "bucket count: " << m.bucket_count() << '\n';
    return 0;
}

บักเก็ตใด

bucket(key) จะบอกดัชนีบักเก็ตที่คีย์ถูกแมปไปอยู่ในขณะนั้น

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<int, int> m{{10, 1}, {20, 2}, {30, 3}};
    std::cout << "key 20 in bucket " << m.bucket(20) << '\n';
    return 0;
}

อัตราการบรรจุ

อัตราการบรรจุ คือ size / bucket_count อัตราที่สูงขึ้นหมายถึงสายโซ่ที่ยาวขึ้นและการค้นหาที่ช้าลง

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<int, int> m{{1, 1}, {2, 2}};
    std::cout << "load factor: " << m.load_factor() << '\n';
    return 0;
}

อัตราการบรรจุสูงสุด

max_load_factor() คือค่าขีดจำกัด เมื่ออัตราการบรรจุสูงกว่าค่านี้ ตารางจะทำ rehash ไปยังบักเก็ตจำนวนมากขึ้น

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<int, int> m;
    std::cout << "default max load: " << m.max_load_factor() << '\n';
    return 0;
}

การทำ rehash ใหม่

การทำ rehash ใหม่จะสร้างตารางขึ้นใหม่โดยใช้บักเก็ตมากขึ้น และมี ค่าใช้จ่ายสูง กระบวนการนี้จะเกิดขึ้นโดยอัตโนมัติเมื่ออัตราการบรรจุเกินค่าที่กำหนด

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<int, int> m;
    std::size_t before = m.bucket_count();
    for (int i = 0; i < 100; ++i) m[i] = i;
    std::cout << before << " -> " << m.bucket_count() << " buckets\n";
    return 0;
}

ใช้ reserve เพื่อหลีกเลี่ยงการทำ rehash ซ้ำ

หากคุณทราบขนาดล่วงหน้า ให้เรียก reserve(n) เพื่อจัดสรรบักเก็ตไว้ล่วงหน้าและหลีกเลี่ยงการทำ rehash ซ้ำหลายครั้ง

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<int, int> m;
    m.reserve(1000);
    std::cout << "buckets reserved: " << (m.bucket_count() >= 1000 ? "yes" : "no") << '\n';
    return 0;
}

การเรียก rehash โดยตรง

rehash(n) จะกำหนดจำนวนบักเก็ตให้มีอย่างน้อย n ใช้ reserve สำหรับจำนวนองค์ประกอบ และใช้ rehash สำหรับจำนวนบักเก็ต

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<int, int> m;
    m.rehash(64);
    std::cout << "buckets >= 64: " << (m.bucket_count() >= 64 ? "yes" : "no") << '\n';
    return 0;
}

การตรวจสอบขนาดบักเก็ต

bucket_size(i) จะแสดงจำนวนองค์ประกอบที่ใช้บักเก็ต i ร่วมกัน ซึ่งมีประโยชน์สำหรับวิเคราะห์การชนกัน

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<int, int> m;
    for (int i = 0; i < 10; ++i) m[i] = i;
    std::cout << "bucket 0 holds " << m.bucket_size(0) << " elements\n";
    return 0;
}

กรณีเลวร้ายที่สุดคือ O(n)

หากใช้ hash ที่ไม่ดีจนเกิดการชนกันจำนวนมาก คีย์ทั้งหมดจะรวมเป็นสายโซ่ในบักเก็ตเดียว และการดำเนินการจะมีประสิทธิภาพลดลงเป็น เวลาเชิงเส้น hash ที่ดีจะช่วยให้การดำเนินการมีประสิทธิภาพ O(1)

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<int, int> m;
    for (int i = 0; i < 5; ++i) m[i] = i * i;
    std::cout << "avg lookups stay fast with good hashing\n";
    std::cout << "load: " << m.load_factor() << '\n';
    return 0;
}

การลดอัตราการบรรจุสูงสุด

การกำหนด max_load_factor ให้ต่ำลงเป็นการแลกหน่วยความจำกับความเร็ว: การชนกันน้อยลง แต่มีบักเก็ตมากขึ้น

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<int, int> m;
    m.max_load_factor(0.5f);
    std::cout << "new max load: " << m.max_load_factor() << '\n';
    return 0;
}

การทำให้ตัววนซ้ำใช้ไม่ได้

การทำ rehash จะ ทำให้ตัววนซ้ำใช้ไม่ได้ แต่ยังคงทำให้การอ้างอิงและพอยน์เตอร์ที่ชี้ไปยังองค์ประกอบใช้งานได้ วางแผนการวนซ้ำให้เหมาะสม

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<int, int> m{{1, 100}};
    int& ref = m[1];
    m.reserve(500);
    std::cout << "reference still valid: " << ref << '\n';
    return 0;
}

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจเกี่ยวกับประสิทธิภาพของตารางแฮช

ทบทวน

คุณได้เรียนรู้กลไกภายในของตารางแฮชดังนี้:

  • คีย์จะจับคู่กับ บักเก็ต และการชนกันจะก่อให้เกิดสายโซ่
  • ตัวประกอบการโหลด = ขนาด / จำนวนบักเก็ต หากเกิน max_load_factor ระบบจะทำการแฮชใหม่
  • ใช้ reserve เพื่อหลีกเลี่ยงการแฮชใหม่ การแฮชใหม่จะทำให้ตัววนซ้ำใช้ไม่ได้ แต่ไม่กระทบการอ้างอิง

หลักสูตรถัดไป: การอ่านและเขียนไฟล์ด้วย fstream

คำถามที่พบบ่อย

บทเรียน “ข้อควรพิจารณาด้านประสิทธิภาพ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ข้อควรพิจารณาด้านประสิทธิภาพ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ข้อควรพิจารณาด้านประสิทธิภาพ”

บักเก็ตและอัตราการโหลด คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “ข้อควรพิจารณาด้านประสิทธิภาพ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. std::unordered_map
  2. unordered_set
  3. ฟังก์ชันแฮชแบบกำหนดเอง
  4. ข้อควรพิจารณาด้านประสิทธิภาพ
← กลับไปที่ C++ Academy