萌えハッカーニュースリーダー

2025/05/22 19:21 Dividing an array into fair sized chunks

出典: https://lemire.me/blog/2025/05/22/dividing-an-array-into-fair-sized-chunks/
hakase
博士

やあ、ロボ子。今日は配列を均等に分割するお話をするのじゃ。

roboko
ロボ子

配列の分割ですか、博士。それは興味深いですね。具体的にはどのような状況を想定しているのでしょうか?

hakase
博士

例えば、N個の要素を持つ配列をM個のチャンクに分割したいとするじゃろ?各チャンクのサイズがほぼ均等になるように分割したいのじゃ。

roboko
ロボ子

なるほど。単純に `N // M` で分割すると、最後のチャンクが不均等になることがある、ということですね。

hakase
博士

そう!ナイーブなアルゴリズムだと、`[0, N//M), [N/M, 2*N//M) ... [N//M*M, N)` の範囲でチャンクを作成することになるからの。例えば、N=5, M=2の場合、チャンクは `[0,2), [2,4), [4,5)` となって、最後のチャンクが小さくなるのじゃ。

roboko
ロボ子

確かに。`ceil(N/M)` を使う方法も考えられますが、これも問題があるようですね。

hakase
博士

`ceil(N/M)` を使うと、チャンクが不足することがあるのじゃ。例えば、N=12, M=5の場合、チャンクサイズは3となり、範囲は `[0,3), [3,6), [6,9), [9,12)` となって、チャンクが足りなくなるのじゃ。

roboko
ロボ子

では、どうすれば良いのでしょうか?

hakase
博士

より良いアプローチは、最初の `N%M` 個のチャンクのサイズを `ceil(N/M)` とし、残りの `N-N%M` 個のチャンクのサイズを `floor(N/M)` とすることじゃ!

roboko
ロボ子

なるほど!剰余を考慮して、チャンクのサイズを調整するのですね。PythonやC++での実装例も紹介されていますね。

hakase
博士

そうじゃ。`get_chunk_range_simple` 関数は、N個の要素をM個のチャンクに分割し、i番目のチャンクの開始インデックスと終了インデックスを返すのじゃ。剰余を考慮して、最初の `N%M` 個のチャンクのサイズを `N//M + 1` とし、残りのチャンクのサイズを `N//M` とするのじゃ。

roboko
ロボ子

C++の実装では、開始インデックスとチャンクの長さを返すのですね。

hakase
博士

この問題は、Robert ClauseckerさんがXに投稿したものらしいぞ。たまには、こういうアルゴリズムの話題も面白いじゃろ?

roboko
ロボ子

はい、博士。勉強になりました。ところで博士、配列を分割する際に、一番気をつけることは何でしょうか?

hakase
博士

そうじゃな…やはり、インデックスOutOfBoundExceptionには気をつけたいものじゃな!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search