1

私が取り組んでいる問題について質問があります。ビデオを繰り返さずに順番にランダムにビデオを再生する必要があります。各動画は、プレイリストごとに 1 回だけ再生できます。各ビデオには、0 から max_video_count までの一意の ID があり、これは実行時に決定されます (サーバーによって異なります)。

私が今やっていることは、再生された各ビデオの一意の ID を追加するリンク リストを作成したことです。0 と max_video_count の間の乱数をランダムに作成するよりも、数値がリンク リストに既にある場合は線形検索を実行し、そうであれば新しい数値を計算します..そして再び線形検索..などなど!!

明らかに、これはあまり実用的ではなく、要素を見つけるのに時間がかかる場合があります。特に、すでに多くの動画が再生されている場合。

だから私は考えました、私は線形検索の代わりに二分検索を実装しますが、それは私が最初にリストをソートしなければならないという問題に私をもたらします。したがって、私の次のステップは、新しいunique_idを挿入しながらリストをソートし、バイナリ検索を行うことだと考えることでした。

二分探索は O(n) 線形探索と比較して O(log n) であることを知っています。これは大きな進歩です。しかし、リストのソートもO(n)です。なぜなら、正しい場所を見つけるには、線形検索を再度実行する必要があるからです.... O(n) 線形検索 -> 線形検索高速。そうですか?たぶん私のアプローチ全体が間違っている..しかし、私はまだ何か良いものを思い付くことができませんでした...

私はアルゴリズムにまったく慣れていないので、誰かがここで私を啓発してくれるとうれしいです:-)

こんにちはマルクス

4

2 に答える 2

7

基本的に、ランダムな順列を見ているだけです。ビデオを 1 つの固定リストに配置してから、プレイリストを作成し、そのリストをランダムに並べ替えて、並べ替えたリストを再生します。

このような順列を達成する典型的で効率的な (O(n)) 方法は、Knuth Shuffle を使用することです。

(実際には、もちろん、インデックス セットのランダムな順列を作成し、順列されたインデックスの順にアイテムを再生することもできます。)

于 2011-11-27T12:35:25.150 に答える
0

ビデオの数が固定されている場合は、すべて false に初期化されたブール値の配列を使用して、再生されたものを追跡することができます - 一定時間のルックアップ。または、代わりに回数を制限したい場合は、再生回数をカウントする整数を使用します。

再生中にビデオがリストから削除 (またはリストに追加) された場合、再生されたものを追跡するための連想配列 (一部の言語では辞書またはハッシュと呼ばれる) の方がおそらく簡単です。

自分で構造を実装しないでください (それが必要な学習課題でない限り)、選択した言語が提供するものを使用してください。

于 2011-11-27T12:45:07.760 に答える