C++ Academy · Pelajaran

Algoritma Numerik: accumulate, reduce, transform_reduce

Agregasikan rentang numerik dengan accumulate, reduce, dan transform_reduce yang sesuai untuk paralelisme

Pelajaran 4 dari 414 langkah

Algoritma Numerik: accumulate, reduce, transform_reduce adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C++ Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C++ Academy mencakup 4 pelajaran total.

Berkas Header <numeric>

Algoritme numerik bekerja pada rentang angka. Algoritme tersebut tersedia dalam <numeric>.

std::accumulate

Reduksi klasik. Secara bawaan menjumlahkan — berikan operasi biner kustom untuk reduksi lain.

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

Reduksi Kustom

Berikan nilai awal dan operasi biner.

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

Tipe Nilai Awal Penting

Tipe akumulator diturunkan dari nilai awal. Berikan 0.0 untuk mengakumulasikan nilai pecahan presisi ganda ke dalam tipe yang sama.

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)

Seperti accumulate, tetapi operasinya harus asosiatif dan komutatif — sehingga evaluasi paralel dimungkinkan.

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

reduce vs accumulate

Dua perbedaan:

  • reduce dapat berjalan secara paralel
  • reduce tidak menjamin urutan operasi — tidak masalah untuk + dan *, tetapi bermasalah untuk operasi yang tidak asosiatif seperti penggabungan string

std::transform_reduce (C++17)

Menggabungkan transformasi dan reduksi dalam satu lintasan. Lebih cepat dan lebih ekspresif daripada transformasi + reduksi yang terpisah.

// 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

Saudara yang lebih lama dari transform_reduce. Menghitung hasil kali dalam (produk titik) dari dua rentang. Kurang umum, tetapi memiliki antarmuka yang lebih sederhana.

std::partial_sum

Menuliskan total berjalan ke rentang keluaran.

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

Kebalikan dari partial_sum — menuliskan selisih antara elemen-elemen yang berurutan.

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}

Catatan tentang Bilangan Titik Mengambang

Untuk bilangan titik mengambang, urutan akumulasi penting karena pembulatan. reduce dapat memberikan hasil yang sedikit berbeda dari accumulate karena urutan evaluasinya tidak ditentukan.

Kasus Penggunaan di Dunia Nyata

Algoritme numerik mendukung:

  • Perhitungan jumlah dan hasil kali
  • Agregat statistik (rata-rata, varians)
  • Produk titik dan norma dalam aljabar linear
  • Jumlah kumulatif untuk kueri prefiks

Pemeriksaan Singkat

Algoritme C++17 mana yang melakukan reduksi paralel pada suatu rentang dengan satu pemanggilan fungsi?

Ringkasan

<numeric> menyediakan accumulate, reduce, transform_reduce, partial_sum, dan adjacent_difference untuk reduksi numerik dan operasi prefiks. Pilih reduce untuk paralelisme dan accumulate untuk urutan yang deterministik.

Gratis untuk memulai

Belajar C++ dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
51
Pelajaran
203

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Algoritma Numerik: accumulate, reduce, transform_reduce” gratis?

Ya — teks lengkap “Algoritma Numerik: accumulate, reduce, transform_reduce” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C++ Academy, upgrade ke CoddyKit PRO. Kursus C++ Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Algoritma Numerik: accumulate, reduce, transform_reduce”?

Agregasikan rentang numerik dengan accumulate, reduce, dan transform_reduce yang sesuai untuk paralelisme Kamu berlatih C++ Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C++ Academy?

Tidak diperlukan pengalaman sebelumnya. C++ Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Algoritma Numerik: accumulate, reduce, transform_reduce” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C++ Academy ini?

Ya. Setiap pelajaran C++ Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Algoritma Tanpa Modifikasi: find, count, all_of
  2. Modifikasi: transform, copy_if, replace
  3. Pengurutan dan Partisi: sort, stable_partition
  4. Algoritma Numerik: accumulate, reduce, transform_reduce
← Kembali ke C++ Academy