C++ Academy · درس

الخوارزميات الرقمية: ‏accumulate وreduce وtransform_reduce

اجمع نطاقات رقمية باستخدام accumulate وreduce وtransform_reduce الملائم للتنفيذ المتوازي.

الدرس 4 من 414 خطوة

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

ترويسة <numeric>

تعمل الخوارزميات العددية على نطاقات من الأعداد. وتوجد في <numeric>.

std::accumulate

خوارزمية الاختزال التقليدية. تجمع القيم افتراضيًا — مرّر عملية ثنائية مخصصة لإجراء اختزالات أخرى.

#include <numeric>
std::vector<int> v = {1, 2, 3, 4, 5};
int sum = std::accumulate(v.begin(), v.end(), 0);
// sum = 15

اختزال مخصص

قدّم قيمة ابتدائية وعملية ثنائية.

int product = std::accumulate(v.begin(), v.end(), 1,
    std::multiplies<int>{});
// product = 120

نوع القيمة الابتدائية مهم

يُستنتج نوع المجمِّع من القيمة الابتدائية. قدّم 0.0 لتجميع قيم النوع double في قيمة من النوع double.

std::vector<double> v = {1.5, 2.5, 3.5};
double sum_d = std::accumulate(v.begin(), v.end(), 0.0);    // 7.5
int    sum_i = std::accumulate(v.begin(), v.end(), 0);      // truncates to 6

std::reduce (C++17)

تشبه accumulate، لكن يجب أن تكون العملية ترابطية وتبديلية، مما يتيح التقييم المتوازي.

#include <numeric>
#include <execution>
std::vector<int> v(1000);
int sum = std::reduce(std::execution::par,
    v.begin(), v.end(), 0);

reduce مقابل accumulate

يوجد اختلافان:

  • قد تُنفَّذ reduce بالتوازي
  • لا تضمن reduce ترتيب تنفيذ العملية — وهذا مناسب للعملتين + و*، لكنه يسبب مشكلات مع العمليات غير الترابطية مثل دمج السلاسل النصية

std::transform_reduce (C++17)

تجمع بين التحويل والاختزال في مرور واحد. وهي أسرع وأكثر تعبيرًا من استخدام transform وreduce منفصلين.

// Dot product
std::vector<int> a = {1, 2, 3}, b = {4, 5, 6};
int dot = std::transform_reduce(
    a.begin(), a.end(), b.begin(),
    0,
    std::plus<int>{},          // reduce
    std::multiplies<int>{}     // transform
);
// dot = 1*4 + 2*5 + 3*6 = 32

std::inner_product

الشقيقة الأقدم لـ transform_reduce. تحسب الضرب الداخلي (الضرب النقطي) لنطاقين. وهي أقل عمومية، لكن واجهة برمجتها أبسط.

std::partial_sum

اكتب المجاميع التراكمية في نطاق إخراج.

std::vector<int> v = {1, 2, 3, 4};
std::vector<int> sums(4);
std::partial_sum(v.begin(), v.end(), sums.begin());
// sums = {1, 3, 6, 10}

std::adjacent_difference

عكس partial_sum — اكتب الفروق بين العناصر المتتالية.

std::vector<int> v = {1, 3, 6, 10};
std::vector<int> diffs(4);
std::adjacent_difference(v.begin(), v.end(), diffs.begin());
// diffs = {1, 2, 3, 4}

تنبيه بشأن الفاصلة العائمة

بالنسبة إلى قيم الفاصلة العائمة، يؤثر ترتيب التجميع بسبب التقريب. قد تعطي reduce نتائج مختلفة قليلًا عن accumulate بسبب ترتيب التقييم غير المحدد.

حالات الاستخدام الواقعية

تدعم الخوارزميات العددية ما يلي:

  • حساب المجاميع والجداءات
  • التجميعات الإحصائية (المتوسط والتباين)
  • الضربات الداخلية والمعايير في الجبر الخطي
  • المجاميع التراكمية للاستعلامات البادئة

اختبار سريع

أي خوارزمية في C++17 تُجري اختزالًا متوازيًا لنطاق باستدعاء دالة واحدة؟

مراجعة

توفر <numeric> الخوارزميات accumulate وreduce وtransform_reduce وpartial_sum وadjacent_difference للاختزالات العددية والعمليات على البوادئ. اختر reduce للتنفيذ المتوازي، وaccumulate لضمان ترتيب حتمي.

البدء مجانًا

تعلم C++ مع معلم ذكاء اصطناعي — مجانًا

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

الدورات
51
الدروس
203

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

هل درس «الخوارزميات الرقمية: ‏accumulate وreduce وtransform_reduce» مجاني؟

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

ماذا ستتعلم في «الخوارزميات الرقمية: ‏accumulate وreduce وtransform_reduce»؟

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

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

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

كم من الوقت يستغرق درس «الخوارزميات الرقمية: ‏accumulate وreduce وtransform_reduce»؟

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

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

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

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

  1. الخوارزميات غير المعدِّلة: ‏find وcount وall_of
  2. الخوارزميات المعدِّلة: ‏transform وcopy_if وreplace
  3. الفرز والتقسيم: ‏sort وstable_partition
  4. الخوارزميات الرقمية: ‏accumulate وreduce وtransform_reduce
← العودة إلى C++ Academy