0Pricing
C Academy · درس

إعادة التحجيم ومعامل التحميل

ضبط الأداء

إعادة التحجيم ومعامل التحميل درس مجاني في C Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 4 دروس في المجموع.

ما معامل التحميل

معامل التحميل هو نسبة العناصر المخزنة إلى عدد الخانات: alpha = size / capacity. وهو يقيس مدى امتلاء الجدول ويؤثر مباشرةً في الأداء.

أهمية معامل التحميل

كلما ارتفع معامل التحميل، احتوت الخانات على سلاسل أطول (أو تكتلت عمليات الفحص)، فتتباطأ العمليات.

  • قيمة alpha منخفضة: سرعة أعلى، لكنها تهدر الذاكرة
  • قيمة alpha مرتفعة: حجم أصغر، لكنها أبطأ

الهدف الشائع للسلاسل هو 0.75.

حساب معامل التحميل

احسبوه كنسبة ذات فاصلة عائمة لكي تتمكنوا من مقارنته بعتبة معينة.

#include <stdio.h>

int main(void) {
    unsigned size = 12, capacity = 16;
    double alpha = (double)size / capacity;
    printf("load factor = %.2f\n", alpha);
    return 0;
}

متى نغيّر الحجم

بعد كل عملية إدراج، تحقّقوا مما إذا كان معامل التحميل قد تجاوز العتبة. وإذا حدث ذلك، كبّروا الجدول (عادةً بمضاعفة سعته) وأعيدوا التجزئة.

#include <stdio.h>

int should_grow(unsigned size, unsigned cap) {
    return (double)size / cap > 0.75;
}

int main(void) {
    printf("%d\n", should_grow(13, 16)); /* 0.8125 -> 1 */
    printf("%d\n", should_grow(10, 16)); /* 0.625  -> 0 */
    return 0;
}

شرح إعادة التجزئة

لا يمكنكم نسخ الخانات مباشرةً، لأن فهرس كل مفتاح يعتمد على السعة. تعيد إعادة التجزئة حساب خانة كل مفتاح وفق السعة الجديدة ثم تعيد إدراجه.

دالة تغيير الحجم

خصّصوا مصفوفة خانات جديدة وأكبر؛ واجتازوا كل عقدة قديمة وانقلوها إلى المصفوفة الجديدة باستخدام السعة الجديدة؛ ثم بدّلوا المصفوفتين. إليكم إعادة حساب الفهرس الأساسية.

#include <stdio.h>

unsigned long djb2(const char *s){unsigned long h=5381;int c;while((c=(unsigned char)*s++))h=((h<<5)+h)+c;return h;}

int main(void) {
    const char *key = "session";
    unsigned old_cap = 8, new_cap = 16;
    printf("old slot = %lu\n", djb2(key) % old_cap);
    printf("new slot = %lu\n", djb2(key) % new_cap);
    return 0;
}

نقل العقد دون إعادة تخصيص

مع السلاسل، يمكنكم نقل العقد الموجودة إلى المصفوفة الجديدة بدلًا من تخصيص عقد جديدة. افصلوا كل عقدة، وأعيدوا حساب خانتها، ثم أضيفوها إلى البداية.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Node { char *key; struct Node *next; } Node;
unsigned long djb2(const char *s){unsigned long h=5381;int c;while((c=(unsigned char)*s++))h=((h<<5)+h)+c;return h;}

int main(void) {
    Node *old[2] = {0};
    Node *a = malloc(sizeof *a); a->key = strdup("x"); a->next = NULL; old[0] = a;
    Node *new_b[4] = {0};
    /* move node a */
    unsigned i = djb2(a->key) % 4;
    a->next = new_b[i]; new_b[i] = a;
    printf("moved to slot %u\n", i);
    return 0;
}

استراتيجية النمو

تحافظ مضاعفة السعة على تكلفة الإدراج المستهلكة O(1): فعلى الرغم من أن تغيير الحجم يستغرق O(n)، فإنه يحدث نادرًا بما يكفي ليبقى متوسط تكلفة كل إدراج ثابتًا.

كما تتيح قوى العدد 2 استخدام قناع AND السريع.

#include <stdio.h>

int main(void) {
    unsigned cap = 8;
    for (int i = 0; i < 4; i++) {
        printf("capacity = %u\n", cap);
        cap *= 2;
    }
    return 0;
}

التقليص

يمكنكم اختياريًا تقليص الجدول عندما ينخفض معامل التحميل كثيرًا (مثلًا إلى أقل من 0.1) بعد عمليات حذف كثيرة. يستعيد التقليص الذاكرة، لكنه يضيف تكلفة إعادة التجزئة؛ لذلك نفّذوه بحذر لتجنب التذبذب المتكرر.

العنونة المفتوحة ومعامل التحميل

تتأثر جداول العنونة المفتوحة بمعامل التحميل بدرجة أكبر بكثير. ينهار الأداء مع اقتراب alpha من 1، ولذلك تعيد هذه الجداول عادةً تغيير الحجم عند قيمة 0.5 إلى 0.7، وهي أقل من قيمة 0.75 الشائعة في السلاسل.

عرض التكلفة المستهلكة

حاكوا عمليات إدراج تضاعف السعة عند 0.75 واحسبوا إجمالي العمل، موضحين بقاء المتوسط منخفضًا.

#include <stdio.h>

int main(void) {
    unsigned cap = 4, size = 0;
    long work = 0;
    for (int i = 0; i < 100; i++) {
        size++; work++; /* the insert */
        if ((double)size / cap > 0.75) { work += size; cap *= 2; } /* rehash */
    }
    printf("inserts=%u total_work=%ld avg=%.2f\n", size, work, (double)work/size);
    return 0;
}

تحقق سريع

اختبروا فهمكم لتغيير الحجم.

مراجعة

تعلّمتم ضبط أداء جداول التجزئة.

  • معامل التحميل = size / capacity
  • غيّروا الحجم عند تجاوز العتبة (نحو 0.75 في السلاسل)
  • أعيدوا التجزئة لأن الفهارس تعتمد على السعة
  • تؤدي مضاعفة السعة إلى عمليات إدراج بتكلفة مستهلكة O(1)

الأسئلة الشائعة

هل درس «إعادة التحجيم ومعامل التحميل» مجاني؟

نعم — نص درس «إعادة التحجيم ومعامل التحميل» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.

ماذا ستتعلم في «إعادة التحجيم ومعامل التحميل»؟

ضبط الأداء تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟

لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «إعادة التحجيم ومعامل التحميل»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟

نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. دوال التجزئة
  2. معالجة التصادمات
  3. الإدراج والبحث والحذف
  4. إعادة التحجيم ومعامل التحميل
← العودة إلى C Academy