LETアルファベット上の文字列の集合で合計に含まれていることをのシンボル。
あなたの仕事は、各文字列を内部的にソートし、結果の文字列を辞書式順序でソートすることです。(アルゴリズムはこのように動作する必要はありません。)
例:
入力:33123 15 1 0 54215 21 12
出力:0 1 12 12 12333 12455 15
時間と空間でそれを行う方法を見つけました。
サイズ配列を作成し、すべてのセルに初期値を与えるような配列を使用しているため、スペースは時間よりも大きくなっています。
各文字列(時間とスペース)をソートするためにバケットソートを使用し、コレクション自体(時間とスペース)をソートするためにワードツリーを使用しました。しかし、私の解決策は複雑すぎます。
時間とより少ないスペース、またはより速い、より良いソリューションがありますか?
ソリューションは確定的でなければならず、ハッシュマップやその他の統計アルゴリズムは使用できません。
私の解決策:スマート配列は、サイズ配列であり、で作成および「初期化」できます。
それらのいずれも初期化せずにのサイズの3つの配列を作成し、という単一の整数変数も保持します。
最初の配列にはデータが含まれています。2番目の配列には、3番目の配列のセルへのポインターが含まれています。3番目の配列には、2番目の配列のセルへのポインターが含まれています。は、これまでに初期化されたセルの数が含まれます。
セルの値を設定したいとします(このセルで初めて行う場合を想定)。次に、最初の配列のセルに移動して、目的の値に設定します。
次に、2番目の配列のセルに移動し、3番目の配列のセルを指すように設定します。3番目の配列のセルを、2番目の配列のセルを指すように設定します。を1 増やします。
セルがゴミ箱であるかどうかを知りたいとします(つまり、まだ何も設定していないことを意味します)。
2番目の配列のセルし、(3番目の配列の)セル(2番目の配列)が指すセル番号を確認します。これをと呼びます。
場合、はゴミ箱です(これまでに初期化されたセルしかなく、はそれらの1つではないため)。
場合、(3番目の配列の)指すセルを調べます。でない場合、はゴミです。そうでなければはゴミではありません
これにより、このセルを初期化したかどうか、および初期化していないかどうかを各ステップで知ることができます。したがって、時間でサイズ配列を作成して「初期化」しました。
主なトリックは、最初に配列全体を初期化することではなく、これまでに初期化したセルを知る方法を見つけ、「見た」ときにのみセルを初期化することです。RAMモデルでは、初期化せずに任意のサイズの配列を作成するのに時間かかります。
次数mの単語ツリーは、TRIEを一般化したものです。各ノードには、その息子へのポインタの配列が含まれています。配列サイズはです。各ノードには、このノードによって記述されているセットの数を示すカウンターも含まれています。
単語(セット)を追加するたびにスマート配列を使用しているので、時間とスペースしかかかりません。
Time cannot be smaller than space
本当。You are cheating in some way
「時間と空間」からは従いません:、 -空間の境界は不必要に緩く見えます。