機械翻訳
トピックの背景
陳小型コンピュータ翻訳ソフトがマシンにインストールされている、彼はしばしば英語の記事を翻訳し、このソフトウェアを使用していました。
タイトル説明
この翻訳ソフトウェアの原則はそれだけで最初から最後まで、順番に各英単語が対応する中国の意味に置き換えられますです、非常に簡単です。メモリがある場合は、各英語の単語について、ソフトウェアはまず、中国語の単語の意味のメモリになります、翻訳ソフトウェアは、それを使用します;ないメモリがない場合、ソフトウェアは、辞書内の外部メモリに、見つけるために検索します中国語の単語の意味や翻訳、およびその後の検索と翻訳のためのメモリに単語と意味の翻訳。
メモリがあると仮定M Mユニットは、各ユニットは、訳語とセンスを格納することができます。既に現在のメモリに記憶されている単語の数が以下である場合、ソフトウェアは、新たな単語の前にメモリに記憶されているときはいつでもM. 1- M. 1、ソフトウェアは、メモリユニットに使用されていない新しい単語を保存され、メモリが保存した場合M Mの言葉は、ソフトウェアは、ユニットを解放し、単語を入力する最初のメモリを消去し、新しい単語を開催します。
長さの英語記事と仮定N Nワードを。この記事を考えるとは、何回外部メモリ辞書を見つけるために必要な翻訳ソフトウェアを翻訳するには?その翻訳開始を想定して前に、メモリには言葉がありません。
入出力フォーマット
入力フォーマット:
合計2 2行。各行は二つの数字の間のスペースで区切られています。
正の整数の最初の二つの行為M、N M 、長N、及び物品の記憶容量を表します。
第二の動作N N非負整数は、物品のために、数(大きさではない超過の各1000 。1 0 0 0)は、英語の単語を表します。二つの言葉は、彼らが非負の整数を対応と同じです場合にのみ、同じ言葉で記事です。
出力フォーマット:
辞書ソフトウェアのニーズの整数。
サンプル入力と出力
コード
する#include <stdio.hの> INT searCnt(INT MRT []、INT CT [])。 int型M、N; INT メイン(){ scanf関数(" %d個の%のD "、&M、&N)。 int型MRY [M]; int型のCT [N]。 以下のために(int型 i = 0 ; iがNを<; iは++ ){ scanf関数(" %のD "、およびCT [I])。 } INT NUMS = searCnt(MRY、CT)。 printf(" %d個の\ n " 、NUMS)。 リターン 0 ; } INT searCnt(INT MRY []、INT CT []){ int型古い= 0 。 int型 CURS = 0は、=カウント0を。 MRY [ 0 ] CT [= 0 ]。古い= 0 ; カウント ++; CURS ++ ; 以下のために(int型 i = 1 ; iがNを<I ++は{) のための(int型 J = 0 ; J <CURS; J ++ ){ 場合(CT [I] == MRY [J]){ ブレークさもなければ。 }{ // !CT [I] = MRY [J] であれば(J == curS- 1 ){ 場合(CURS < M){ MRY [CURS ++] = CT [I]; カウント ++; 破ります; } MRY [古い] = CT [I]を、 古い =(旧+ 1)%のM。 カウント ++; 破ります; } 続けます。 } } } リターン回数、 }
コードの考え
解決策1:
私は彼がキューを考え、友人から来ます。彼は、メモリ待ち行列を作る尾に頭、エンドポイントを指して開始することになります。時間計算量はO(N * CURS)、0からMまで現在のデジタルCURS堆積、CURS(Mは、メモリ空間である)の特徴数です。宇宙複雑:1000の配列を作成する能力。
対処方法2:
私自身の限られたアイデア(上記のコード)が、私はターンの後、時間の複雑さとO(N * CURS)、スペースの複雑さは、与えられた配列の長さのためにO(M + N)、Nです。
既に存在する場合、あなたは(仮想化は、存在しない)「辞書」を訪問する必要はありません、「メモリ」の各桁の所定の配列が既に存在するかどうかを決定することです、この質問は実際には非常に簡単であると思いました、そうでない場合、あなたは辞書にアクセスすることになるでしょう。我々はそれを行う必要があるとき++はできる数の「メモリ」一致が数字で発見されていない、訪問の数は「辞書」です!