一般的な理解のための全体的なタスク: 関数 f(x) の結果をプロットする必要があります。簡単な作業ですが、2 つの問題があります。
- x の値ごとに、f(x) の計算には多くの時間がかかります (数十分または約 1 時間)。
- f(x) の推定形状がわからないため、関数を正しく表すために事前定義された x 制限で必要な x 値がいくつあるかわかりません。
新しい f(x) 値を取得するたびに f(x) のプロットを更新したいと思います。結果的に f(x) を解きたくないので、詳細レベルを上げたいので、プロットを見るたびに、(x_min, x_max) の範囲全体で表示され、この範囲内でゆっくりと更新されます範囲。
したがって、問題は次のとおりです。適切な順序で x のリストを提供する関数が必要です。
二分探索に触発されて、次のアルゴリズムを思いつきました。
list
x値のaには一意の値のみが含まれ、並べ替えられます。
def dissort(a)
step = len(a) - 1
picked = [False for x in a]
out = []
while False in picked and step > 0:
for k in range(0, len(a), step):
if not picked[k]:
out.append(a[k])
picked[k] = True
step = step // 2
return out
in = [1, 2, 3, 4, 5, 6, 7, 8, 9]
out = [1, 9, 5, 3, 7, 2, 4, 6, 8]
assert(dissort(in) == out)
ここにいくつかの欠陥があります。picked
配列は不要な場合があり、選択された値は詳細レベルが上がるたびに不必要にチェックされます。今のところパフォーマンスに満足していますが、将来的にはもっと大きなリストにも使用できます。
よりパフォーマンスを上げる方法はありますか?一部のpythonパッケージにはすでに実装がありますか? 私はそれを見つけることができませんでした。