2017-09-28 10 views
3

私はリストの最大値を(maximumを使って)見つけることに取り組んでいます。この関数はリスト全体を処理して目標に達する必要があり、明らかに遅くなりますリストが大きくなるにつれて。残念なことに、私のリストは巨大(数億)です。Haskell :: Lists as Slower関数が大きくなっていく

これが唯一の方法ですか?またはこれを行うより速い方法がありますか?私はハスケルが高速だが、この時点では(遅くなっている)、maximumを見つけるための他のオプションがあるのだろうかと思っています。

+0

数字をすべて確認せずに無関係な数字のリストの最大値をどのように見つけることができますか?次の2つのオプションしかありません。(a)数字に何らかの相関があります。または(b)おそらくアレイを使うことができます。なぜなら、これは通常は横断する方が速いからです。しかし、(b)の場合でも、* O(n)*時間はかかるでしょう。 –

+7

どのようにリストを生成していますか? – MathematicalOrchid

+1

最大値は可換分であるため、適切な並列ノードがあれば、ジョブを配布することができます。しかし、これはあなたの巨大なデータセットがすでにチャンク化されていると仮定しています。それがちょうどあなたが遅れて生成しているリストであれば、それを単に消費することはまだより速いです。 https://stackoverflow.com/questions/4028210/how-do-i-write-a-parallel-reduction-using-strategies-in-haskellには手がかりがあるかもしれません。 –

答えて

1

私はこの機能が目標を達成するためにリスト全体を処理する必要があることを知っています。リストが大きくなるにつれて明らかに遅くなります。

ハスケルで最大を見つけるのはO(n)です(おそらく他のすべての言語も同様です)。具体的なベンチマークとコードがない限り、これはまったく予想通りです。

0

各値を「見て」、最も高い値を選択する必要があるので、O(n)が最良の解決策です(他の情報は使用できません)。関数を複数回実行する必要がある場合は、リストをソート(昇順または降順)し、またはlastの時間複雑度を持つの関数を使用し、haskells sortはマージソートでO(n log n)ワーストケース平均的なケースのパフォーマンスです。

+0

ハスケルのリストは、おそらく無限の単独リンクリストとして動作する、リスプスタイルです。 'last'はO(n)です。配列の最後の要素を抽出するのはO(1)です。 –

関連する問題