タグ付けされた質問 「sorting」

いくつかの順序関係に関して要素のセットを順序付けるアルゴリズムの問​​題。


1
最小限の引き出しの動きで、順序付けられていないアイテムの山を引き出しに分類する
しばらく前、私は夜遅くに洗濯をしていました。洗濯物を寮に持ち帰ると、片付け始めました。 私のワードローブは次のように設定されています: 私の引き出しは、持っている衣類の種類によって分類されており、私はそのことに非常にこだわっています。これは、パンツの引き出しにTシャツを入れられないことを意味します(それ以外の場合は、毛羽立ちすぎて寝ることができません)。もちろん、私はこの分類を知っており、暗闇の中でもどの引き出しがどれであるかを知っています。 私はきれいな洗濯物を個持っており、引き出しが縦に並んでいます(引き出しの一番上が)NNNMMMD0D0D_0 引き出しは開閉可能ですが、引き出しが開いていると、衣類を引き出し入れることができません(ブロックされているため)。D私DiD_iDi + 1Di+1D_{i+1}D私DiD_i 部屋に入ると、引き出しはすべて閉じています。 終了したら、開いている引き出しをすべて閉じなければなりません。 私は思いやりのある紳士で、ルームメイトを起こしたくありません(これは大学の寮だったので、同じ部屋で寝ていました)。私はライトをオンにしないで、できるだけノイズを少なくすることにしました。 これは、以下の制約の下で洗濯物を片付けなければならないことを意味します。 洗濯物が見えないので、引っ張った瞬間に何を掴んでいるか分からない。 引き出しを開閉すると音がします。ランドリーバッグからアイテムを引き出したり、実際に引き出しに入れたりしても、そうはいきません。 一度に片方の衣類しか片付けることができません。床が汚れすぎて手が届かない家具のスペースがないので、私は服のように折りたたんで積み重ねることができません(それからそれらの積み重ねを置きません)。 衣類をバッグに入れて別のアイテムを取り出すことはできますが、次に取り出すのは、入れたばかりのアイテムである可能性があります(バッグから何を取り出すかは制御できません)。 このことから、3つの質問があります。 引き出しの開閉をできる限り少なくするために、洗濯物をどのように片付けることができますか? 他の誰かがこの問題または同様のことを考えましたか? この問題には実用的な用途がありますか?

1
ピボットとして平均を使用すると、クイックソートがスピードアップしますか?
どういうわけか私は昨夜クイックソートについて考え、ウィキペディアでそれについて読んでいました。私にとって興味深い部分は、次のとおりです。「ピボットを中央の50%から一貫して選択できれば、リストを最大で分割するだけで済みます。ピボットの選択は、動作につながる可能性があるクイックソートの1つの考えられる問題のようです。log4/3nlog4/3⁡n\log_{4/3} nO(n2)O(n2)O(n^2) 私の考えは、各ステップでパーティションの平均値をピボットとして使用すると、速度が大幅に向上する可能性があります。特にいくつかのステップの後、外れ値がリストの独自の区分にある場合、平均と中央値は互いに非常に近いはずです(もう一度、大きなリストを見てください)。各ステップで平均を計算するための追加の時間はなければなりません。したがって:nnn クイックソートの推定時間:nAlog4/3nnAlog4/3⁡nnA\log_{4/3} n Quicksort_meanの推定時間:2nAlog5/3n2nAlog5/3⁡n2nA\log_{5/3} n (5/3は、私が控えめに見積もる可能性が高いです。サブセットは外れ値がないため、すぐに2に近づく可能性があります)。したがって、約10,000エントリから開始すると、Quicksort_meanは(平均して)Quicksortよりも高速になります。さらに、スタックの最小要素または最大要素をとらないようにバインドされているため、になるリスクは決してありません。O(n2)O(n2)O(n^2) 私の主な質問は次のとおりです。何か見逃しましたか?私は認めなければなりません、私は自分でクイックソートを実装したことがないので、全体の他の部分(ストレージなど)を見逃す可能性があります

2
サブリストがかなりのメモリを占有しているのに、なぜクイックソートが「インプレース」と記述されるのですか?確かにバブルソートのようなものだけが配置されていますか?
クイックソートは「インプレース」と説明されていますが、次のような実装を使用しています。 def sort(array): less = [] equal = [] greater = [] if len(array) > 1: pivot = array[0] for x in array: if x < pivot: less.append(x) if x == pivot: equal.append(x) if x > pivot: greater.append(x) return sort(less) + equal + sort(greater) else: return array 再帰ごとにリストのコピーを作成する必要があります。最初の戻りまでに、メモリには次のようになります。 アレイ 大きい+等しい+小さい …

1
トポロジカルソートの手順、その正確さの証明
定義:状態機械の保存された不変条件は、状態に関する述語、が状態に対して真であり、が何らかの状態である場合、は次のようになります。 。PPPP(q)P(q)P(q)qqqq→ rq→rq \rightarrow rrrrP(r )P(r)P(r) 定義:折れ線グラフは、エッジがすべて1つのパス上にあるグラフです。 定義:正式には、状態機械は、セットの要素が「状態」と呼ばれ、関係が遷移関係と呼ばれ、遷移関係のグラフの矢印がトランジションと呼ばれます。状態から状態への遷移は、と記述されます。qqqrrrq→ rq→rq \rightarrow r DAG:有向アシリックグラフ 次の手順は、任意の有向グラフ適用できます。GGG サイクルにあるエッジを削除します。 削除エッジ頂点からパスがある場合に頂点には含まれていません。< u → v ><u→v>あなたuuvvv< u → v ><u→v> 頂点と頂点間にどちらの方向にもパスがない場合は、エッジを追加します。< u → v ><u→v>あなたuuvvv 該当するものがなくなるまで、これらの操作を繰り返します。 この手順は、状態マシンとしてモデル化できます。開始状態はであり、状態はすべてと同じ頂点を持つ可能な有向グラフです。GGGGGG (b)プロシージャがダイグラフで終了する場合、はと同じ頂点を持つ折れ線グラフであることを証明します。HHHHHHGGG ヒント:が折れ線グラフでない場合、何らかの操作が適用可能でなければならないことを示します。HHH (c) DAGであることが手順の保存された不変であることを証明します。 (d)そのことを証明するGGG はDAGであり、手順が終了すると、最終的な折れ線グラフのウォーク関係はトポロジの種類になります。 GGG。 ヒント:述語が P(u 、v )P(u,v)P(u,v)::からの有向パスがあります あなたuu に vvv 2つの頂点について、手順の保存された不変式です u 、v u, vu, \ …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.