2022年1月21日Exception/LRUアルゴリズム
今日はExceptionとLRUアルゴリズムを勉強しました.
Exception
コンパイルエラー(compile-timeerror):ソースコード構文エラー ランタイムエラー(runtimeerror):入力値が間違っているか、配列のインデックス範囲を超えています.
エラー 論理エラー(logical error):構文に問題はなく、実行時にもエラーはありません.
開発者の希望通りに稼働していない場合 システムエラー(systemerror):コンピュータエラーで操作できないエラー->ソースコード解決 これらの状況は問題を探し出して解決すればいい.でも今日勉強するコンセプトはExceptionです.
Exception例外という意味で、例外とは思わぬ事態を指す. プログラミングで多くのエラーが発生します. Javaでプログラムを作成した開発者が予期した正常な処理を完了していない場合、例外が発生します.
これはこの件を処理する方法です. 予測可能なエラーの処理と考えられる. このような異常処理の原因は,プログラムの異常終了を防止し,正常な運転状態を保つためである.異常が発生した場合、この問題は、どのように処理するかの論理を予め体現することによって解決される.その時このtry文が現れますハーモニーで見てみましょう
上のコードは、整数変数numに整数を入力させ、その値を再出力するコードです.
ただし、ユーザーがここに整数値を入力しないと、エラーが発生します.そのときこのtry文を使用します.
文字列abcを入力すると、このコードは最後の出力コードです.
正常値を入力したときの出力値と、正常値を入力しなかったときの出力値に整理します.正常値を入力
出力値:
整数を入力してください:10
これは必ず実行します!
入力された整数は、10 です.入力異常値
出力値:
整数を入力してください:afhs
整数を入力します.
これは無条件実行です! こうなるどうしてここでこれを実行しなければならないのですか!このような部分はまだ見られますか?
それは最後の一言だからです.この部分は間違いがなくても無条件に実行される.
Exceptionはここまでにしましょう
LRUアルゴリズム
lru(0,"c"); lru(1,"b"); lru(2,"a");
こうなります.なぜなら、最近入れたコードのキー値を0に設定するからです.したがって、最近加算された値はキー値0です.すると、元々存在していた値は、キー値が1つずつ押されるにつれて位置が変化する.
つまり、最も古い値を最後にします.
lruアルゴリズムは,データサイズが満タンである場合に,最も古い値を削除するアルゴリズムである.したがって、上記の場合、lru(2,“a”)の値を削除します.範囲を超えないようにキャッシュのサイズを決定したので,常に最後のキー値は2である.次に2は,3と仮定したキャッシュサイズ−1の値である.
このロジックは、キャッシュサイズがどんな値であっても成立します.データがいっぱいになると、最初のキー値は常にキャッシュサイズ-1、すなわちlruである.size-1の値です. 上記の論理が成立するのでlru.size-1位置の値を削除し、値を0に戻します.また、上記のコードと値に何も含まれていない場合(上記のコード)は、合計5時間加算されます.最後に,出力総時間がどれくらいであるかを記述して終了する.
昨日ポスターをアップするつもりでしたが、新しく出た『ゲーム王マスターDual』を作りたいので、友達と一晩中思い出しました.だから書き終わっていないので、寝るのが遅すぎます.朝起きてアップしたばかり…!でもゲーム王は本当に面白かったパラグライダーも夢に見た.
Exception
実は、私はこの概念をあまり勉強していません.今日は昨日勉强したMap,ArrayList,Setについてもっと详しく勉强してプログラミングして、ここに书きたくありません.今日学んだ概念はこれだけなので、整理したいです.でも今日はここまでやって次はやる
プログラミングはいろいろな間違いに遭遇します.片付けましょう.
エラー
開発者の希望通りに稼働していない場合
Exception
これはこの件を処理する方法です.
public class ExceptionTest {
public void test1() {
Scanner sc = new Scanner(System.in);
while(true) {
System.out.print("정수를 입력하세요 : ");
int num=0;
try{
num = sc.nextInt();
}catch (Exception e) {
System.out.println("정수를입력하라구.");
sc.nextLine();
continue;//그래도 finally는 실행됨
}finally {
System.out.println("이건 무조건 실행!");
}
System.out.println("입력한 정수는 : "+num);
}
}
}
今日はこのコードで全部整理します.それほど内容がない.上のコードは、整数変数numに整数を入力させ、その値を再出力するコードです.
ただし、ユーザーがここに整数値を入力しないと、エラーが発生します.そのときこのtry文を使用します.
文字列abcを入力すると、このコードは最後の出力コードです.
System.out.println("입력한 정수는 : "+num);
いいえ、catch (Exception e) {
System.out.println("정수를입력하라구.");
sc.nextLine();
continue;//그래도 finally는 실행됨
}
この部分から始めます.コードにエラーがない場合は、このセクションが実行されます.正常値を入力したときの出力値と、正常値を入力しなかったときの出力値に整理します.
出力値:
整数を入力してください:10
これは必ず実行します!
入力された整数は、10
出力値:
整数を入力してください:afhs
整数を入力します.
これは無条件実行です!
それは最後の一言だからです.この部分は間違いがなくても無条件に実行される.
Exceptionはここまでにしましょう
LRUアルゴリズム
LRUアルゴリズムはアルゴリズムであり,簡単に言えば配列の記憶空間が満たされていれば,最も古い値を捨てて新しい値を受け入れることができる.Kakaoコードテストで発生した問題を見て実現しましょう
筆者はArrayListとHashMapの資料構造を一緒に使うためにめちゃくちゃなことをしたが,この問題は解決できなかった.でもこの問題は難しいですね.プログラミング時間が長くなく、贅沢で自負しています.だめなのは私にはできないからです.勉強を続けよう筆者.とにかく、早く問題を解決しましょう.
筆者はArrayListのみで回答します.でも実際にLinkedListを使えばもっと早く簡単に解けるそれは次回もう一度やってアップしましょうまず、ScannerとArrayListオブジェクトを追加し、出力実行時間の変数を宣言します.public void main() {
ArrayList<String> lru = new ArrayList<String>(); //알고리즘을 구현할 자료구조 객체
ArrayList<String> cities = new ArrayList<String>(); // 사용자한테서 입력받은 값을 저장할 자료구조 객체
Scanner sc = new Scanner(System.in); // 그냥 스캐너
int totalTime = 0; //총 시간
注釈になぜそんなことをしたのか書いてありますが、気になる人に読んでもらいたいです.実は誰も私の文章を見に来なかった.私も知っています.私はただ勉強したことを整理したいだけです.
次に、キャッシュのサイズと都市のレイアウトをユーザーから直接入力します.System.out.print("캐시의 크기를 입력하세요(0~30) : ");
int cacheSize = sc.nextInt();// 캐시의 크기
System.out.print("도시의 문자열을 입력하세요 : ");
sc.nextLine();//버퍼 비우기
String cityName = sc.nextLine();//도시들 이름 받기
上の写真を見ると「済州」、「Pangyo」、「ソウル」、「ニューヨーク」、「LA」、「済州」、「Pangyo」、「ソウル」、「NewYork」、「LA」と入力されています.
入力した文字列をStringTokenizerに分割します.StringTokenizer st = new StringTokenizer(cityName, ", ");// 입력받은 배열을 ","기준으로 나눔
while (st.hasMoreTokens()) {
String str1 = st.nextToken().toLowerCase();//모두 소문자로 변환해서 리턴
cities.add(str1);//ArrayList형 자료구조 cities에다 값을 입력
}
入力した値を「,」の基準で配布し、最初に作成した都市に挿入します.
時間だけが残っています.入力したキャッシュ値が0のときから作成を開始します.else {// if end // 캐시 사이즈가 0 이상인 경우
for (int i = 0; i < cities.size(); i++) {
String city = cities.get(i);
//현재 lru에 이번회차 도시이름이 존재하는지 확인 indexOf
//indexOf(매개변수) : 매개변수로 전달된 객체가 리스트의 몇번째에 존재하는지 리턴하는 메소드(존재하지않으면 -1 리턴)
int result = lru.indexOf(city);
indexOfを使用してresultで次の値を受け入れます.この変数でlruの値が等しいか否かを判断する.そして状況に応じて異なるコードを書きます.if(result != -1) { //현재 캐시에 해당하는 도시명이 존재하는 경우
lru.add(0,lru.remove(result)); //원래 있던 값을 삭제하고 0번에 집어넣는 과정
totalTime += 1; //현재 값 +1
}
現在の値がlruの値と同じである場合、元の値を含む部分を削除し、キー値が0の位置で再びlruに戻します.sizeは追加しません.同じ値がある場合は+1時間かかります.}else { //현재 캐시에 해당하는 도시명이 존재하지 않는 경우
if(lru.size() == 0) { // 리스트에 아무 값도 없을 때
lru.add(city);
今回、キャッシュに入力された都市名がない場合.この場合,lruを既に値がある場合とない場合に分けてコードを記述する.ないときはそのまま追加すればいいです}else {
if(lru.size()==cacheSize) { //리스트길이와 캐시 최대크기를 비교
lru.remove(lru.size()-1); //캐시가 꽉 차있으면 마지막데이터 삭제
}
lru.add(0,city); // 리스트에 값이 하나라도 있을 때
}
totalTime += 5; //현재 값 +5
lruにデータがある場合、入力したキャッシュサイズと現在のlru.キャッシュサイズとlruの場合sizeを比較します.大きさが同じならlru.sizeは、キャッシュサイズを超えないように最後の値を削除します.どうしてsize-1値を削除するかどうか見てみましょう.
lru.size-1の原因
キャッシュサイズを3とします.lruがArrayListの場合、入力値はa、b、c
public void main() {
ArrayList<String> lru = new ArrayList<String>(); //알고리즘을 구현할 자료구조 객체
ArrayList<String> cities = new ArrayList<String>(); // 사용자한테서 입력받은 값을 저장할 자료구조 객체
Scanner sc = new Scanner(System.in); // 그냥 스캐너
int totalTime = 0; //총 시간
System.out.print("캐시의 크기를 입력하세요(0~30) : ");
int cacheSize = sc.nextInt();// 캐시의 크기
System.out.print("도시의 문자열을 입력하세요 : ");
sc.nextLine();//버퍼 비우기
String cityName = sc.nextLine();//도시들 이름 받기
StringTokenizer st = new StringTokenizer(cityName, ", ");// 입력받은 배열을 ","기준으로 나눔
while (st.hasMoreTokens()) {
String str1 = st.nextToken().toLowerCase();//모두 소문자로 변환해서 리턴
cities.add(str1);//ArrayList형 자료구조 cities에다 값을 입력
}
else {// if end // 캐시 사이즈가 0 이상인 경우
for (int i = 0; i < cities.size(); i++) {
String city = cities.get(i);
//현재 lru에 이번회차 도시이름이 존재하는지 확인 indexOf
//indexOf(매개변수) : 매개변수로 전달된 객체가 리스트의 몇번째에 존재하는지 리턴하는 메소드(존재하지않으면 -1 리턴)
int result = lru.indexOf(city);
if(result != -1) { //현재 캐시에 해당하는 도시명이 존재하는 경우
lru.add(0,lru.remove(result)); //원래 있던 값을 삭제하고 0번에 집어넣는 과정
totalTime += 1; //현재 값 +1
}
}else { //현재 캐시에 해당하는 도시명이 존재하지 않는 경우
if(lru.size() == 0) { // 리스트에 아무 값도 없을 때
lru.add(city);
}else {
if(lru.size()==cacheSize) { //리스트길이와 캐시 최대크기를 비교
lru.remove(lru.size()-1); //캐시가 꽉 차있으면 마지막데이터 삭제
}
lru.add(0,city); // 리스트에 값이 하나라도 있을 때
}
totalTime += 5; //현재 값 +5
こうなります.なぜなら、最近入れたコードのキー値を0に設定するからです.したがって、最近加算された値はキー値0です.すると、元々存在していた値は、キー値が1つずつ押されるにつれて位置が変化する.
つまり、最も古い値を最後にします.
lruアルゴリズムは,データサイズが満タンである場合に,最も古い値を削除するアルゴリズムである.したがって、上記の場合、lru(2,“a”)の値を削除します.範囲を超えないようにキャッシュのサイズを決定したので,常に最後のキー値は2である.次に2は,3と仮定したキャッシュサイズ−1の値である.
このロジックは、キャッシュサイズがどんな値であっても成立します.データがいっぱいになると、最初のキー値は常にキャッシュサイズ-1、すなわちlruである.size-1の値です.
} // else end
System.out.println("총 시간 : "+totalTime);
終わりました.お疲れ様でした.昨日ポスターをアップするつもりでしたが、新しく出た『ゲーム王マスターDual』を作りたいので、友達と一晩中思い出しました.だから書き終わっていないので、寝るのが遅すぎます.朝起きてアップしたばかり…!でもゲーム王は本当に面白かったパラグライダーも夢に見た.
Reference
この問題について(2022年1月21日Exception/LRUアルゴリズム), 我々は、より多くの情報をここで見つけました https://velog.io/@hing/2022-01-21-Exception-LRU-알고리즘テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol