JavaScriptデータ構造(2):キュー
20706 ワード
1.What is Q?
Qを説明させてもらいましたが、今回はびっしり並んでいる様子を見ましたか?その上の写真はソウル駅です.これは祝日のために列車の切符を予約した様子です.汽車の切符の前売りの時は列に並んでいて、先に着いたら先に得ます.先着順の形式.
以上は英漢辞典に照会した結果です.一言で言えば、Qはマイナスです.そして、先着順が原則です.すなわち,先入先出(FIFO)または後入後出(LILO)が特徴である.キューはスタックと同様に抽象的なデータ構造であるため,先着順の原則を守ればデータのフォーマットは関係ない.
2.実装キュー
今回はES 6構文クラスを用いてキュー資料構造を実現する.
次はJavaScriptコードです.
class Queue {
constructor() {
this.storage = {}; // 여기에 담을 것이다.
this.front = 0;
this.rear = 0;
}
size() {
return Object.keys(this.storage).length;
}
// 큐에 데이터를 추가 할 수 있어야 합니다.
enqueue(element) {
this.storage[this.rear] = element;
this.rear += 1;
}
// 가장 먼저 추가된 데이터가 가장 먼저 추출되어야 합니다.
dequeue() {
// 빈 큐에 dequeue 연산을 적용해도 에러가 발생하지 않아야 합니다
if (Object.keys(this.storage).length === 0) {
return;
}
const result = this.storage[this.front];
delete this.storage[this.front];
this.front += 1;
return result;
}
}
次に、上記のクラスに基づいて実際に適用された例を示します.const queueData = new Queue;
queueData.enqueue('a'); //'a'를 넣는다
queueData.enqueue('b'); //'b'를 넣는다
queueData.enqueue('c'); //'c'를 넣는다
console.log(queueData); // {storage: {…}, front: 0, rear: 3}
// storage: {0: "a", 1: "b", 2: "c"}
console.log(queueData.size()); // 큐의 길이는 3
queueData.dequeue(); // 콘솔에는 'a'가 찍힌다
console.log(queueData); // {storage: {…}, front: 1, rear: 3}
// storage: {1: "b", 2: "c"}
// 즉 먼저 삽입된 'a'가 빠진 것을 알 수 있다.
3.キュー例:プリンタ
プリンタの印刷方法もキューに従います.先に注文した先印.しかし、これは終わりではありません.コンピュータの使用効率を向上させるためには、一時的に格納されるバッファ容量も考慮する必要があります.また,一度に最大同時保存する文書量も考慮する.したがって、queuePrinterという関数を作成し、すべてのドキュメントを印刷するのに要する最小時間を返します.因子は以下の通りである.
番号付けタイプの印刷ジョブリストサイズ
番号付け印刷ジョブリストに追加可能な最大容量
まず、ドキュメントの配置は順番に印刷しなければならないので、キューの形式であることがわかります.また、少なくとも時間がかかるので、時間をマークする変数も必要です.キューに0をフォーマットします.これまでのコードは次のとおりです.
function queuePrinter(bufferSize, capacities, documents) {
let time = 0; // 걸린 시간(초)
let queue = []; // 문서를 여기에 옮길 것이다.
let totalBufferVolume = 0; // 문서가 버퍼에 들어갈 때 총 들어간 용량이다.
// queue에 bufferSize만큼 0을 삽입 (queue에 들어갈 요소의 고정 갯수를 만들어 주는 과정입니다.)
for(let i = 0; i < bufferSize; i++){
queue.push(0);
}
}
ドキュメントを最初に印刷するときは(1秒)を考慮します.現在のドキュメントが何であるかを指定し、コピーではなくqueue配列にドキュメントの最初の受信配列を移動します.また、ドキュメントがバッファに移動されているため、totalBufferVolumeでも変更された値が変更されます.そして、秒を表す時間変数に1(1秒経過)を加算します.ここまでのコードは以下の通りです. let currentDocument = documents.shift();
queue.unshift(currentDocument);
queue.pop(); // 이는 queue의 배열의 length를 일정하게 하게 만드는 스킬이다.
totalBufferVolume += currentDocument;
time++;
今から1秒後、仕事を繰り返すだけでいいです.繰り返し条件は、ドキュメント内のバッファの合計容量が0より大きいことです.印刷が完了すると、バッファに入る総容量はゼロになるからです.2秒から合計バッファの容量を変更します.新しい書類があるからです.また、新しいドキュメントがバッファに入る場合がありますが、容量が不足してバッファに入れない場合があります.それぞれの状況をエンコードすればいいです.次は1秒後の場合の符号化です.while (totalBufferVolume) {
// totalBufferVolume(총 용량)에 queue의 마지막 배열을 빼준다.
totalBufferVolume -= queue.pop();
// document의 맨 앞의 요소를 일단 빼고, 현재 문서로 저장한다.
currentDocument = documents.shift();
// 여기서 용량에 따라서 분기점이 생긴다.
// 만약 여유공간이 있다면
if (currentDocument + totalBufferVolume <= capacities) {
// queue에 currentDocument 삽입 후 총 용량에 현재 문서의 용량을 더해준다.
queue.unshift(currentDocument);
totalBufferVolume += currentDocument;
} else { // 용량이 모자른 경우
// documents에 현재 문서를 맨 앞에 다시 넣어준다.(shift해준것을 다시 복구)
documents.unshift(currentDocument);
queue.unshift(0);// 추가된 문서가 없기 때문에 맨 앞의 queue에 0을 추가
}
time++; // 1초의 경우처럼 마지막에 시간을 1초 추가해준다.
}
次にcountに戻ります.総コードは次のとおりです.function queuePrinter(bufferSize, capacities, documents) {
let time = 0; // 걸린 시간(초)
let queue = []; // 문서를 여기에 옮길 것이다.
let totalBufferVolume = 0; // 문서가 버퍼에 들어갈 때 총 들어간 용량이다.
// queue에 bufferSize만큼 0을 삽입 (queue에 들어갈 요소의 고정 갯수를 만들어 주는 과정입니다.)
for(let i = 0; i < bufferSize; i++){
queue.push(0);
}
let currentDocument = documents.shift();
queue.unshift(currentDocument);
queue.pop(); // 이는 queue의 배열의 length를 일정하게 하게 만드는 스킬이다.
totalBufferVolume += currentDocument;
time++;
while (totalBufferVolume) {
// totalBufferVolume(총 용량)에 queue의 마지막 배열을 빼준다.
totalBufferVolume -= queue.pop();
// document의 맨 앞의 요소를 일단 빼고, 현재 문서로 저장한다.
currentDocument = documents.shift();
// 여기서 용량에 따라서 분기점이 생긴다.
// 만약 여유공간이 있다면
if (currentDocument + totalBufferVolume <= capacities) {
// queue에 currentDocument 삽입 후 총 용량에 현재 문서의 용량을 더해준다.
queue.unshift(currentDocument);
totalBufferVolume += currentDocument;
} else { // 용량이 모자른 경우
// documents에 현재 문서를 맨 앞에 다시 넣어준다.(shift해준것을 다시 복구)
documents.unshift(currentDocument);
queue.unshift(0);// 추가된 문서가 없기 때문에 맨 앞의 queue에 0을 추가
}
time++; // 1초의 경우처럼 마지막에 시간을 1초 추가해준다.
}
return time;
}
Reference
この問題について(JavaScriptデータ構造(2):キュー), 我々は、より多くの情報をここで見つけました https://velog.io/@porupit0122/JS-자료구조-2-큐Queueテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol