1スパース配列
- いわゆるスパース配列は、配列内のほとんどのコンテンツ値が未使用(またはすべてゼロ)であり、配列内のスペースのごく一部のみが使用されている場合です。これにより、メモリスペースが無駄になります。メモリスペースを節約し、配列内の元のコンテンツ値に影響を与えないようにするために、スパース配列を使用してデータを圧縮できます。
1.1スパース配列のアプリケーションシナリオ
1.2スパース配列の基本的な紹介
- 配列内のほとんどの要素が0または同じ値の場合、スパース配列を使用して配列を格納できます
- スパース配列の処理方法
- レコード配列には合計でいくつかの行と列があり、そこにはいくつの異なる値があります
- 異なる値を持つ要素の行と列を小さな配列に記録することにより、プログラムのサイズを縮小します
1.3スパース配列のアプリケーション
- 2D配列をスパース配列に変換します
- 元の2次元配列をトラバースして、有効なデータデータの総数を確認します
- 有効なデータの数に基づいてスパース配列を作成します[有効な配列+1]
- 有効なデータを2D配列のスパース配列に格納します
- IOを介してスパース配列をディスクに書き込みます
- スパース配列を元の2次元配列に変換します
- ディスクからスパース配列を読み取り、上記のように最初の行のデータに従って元の2次元配列を作成します。int[15] [15]
- スパース配列の残りの数行のデータを読み取り、それを2次元配列に割り当てます
1.4スパース配列コードの実装
1.4.1 2次元配列を作成し、初期値を割り当てます
public static int[][] twoDimensionalGoBang() {
int goBang[][] = new int[15][15];
goBang[3][3] = 1;
goBang[4][4] = 2;
return goBang;
}
复制代码
1.4.2元の2次元配列をスパース配列に変換する
public static int[][] twoDimensionalToSparse() {
int[][] goBang = twoDimensionalGoBang();
int valid = 0;
for (int i = 0; i < goBang.length; i++) {
for (int j = 0; j < goBang.length; j++) {
if (goBang[i][j] != 0) {
valid++;
}
}
}
int[][] sparse = new int[valid + 1][valid + 1];
sparse[0][0] = goBang.length;
sparse[0][1] = goBang.length;
sparse[0][2] = valid;
int count = 0;
for (int i = 0; i < goBang.length; i++) {
for (int j = 0; j < goBang.length; j++) {
if (goBang[i][j] != 0) {
count++;
sparse[count][0] = i;
sparse[count][1] = j;
sparse[count][2] = goBang[i][j];
}
}
}
return sparse;
}
复制代码
1.4.3スパース配列を元の2次元配列に変換する
public static void main(String[] args) {
int[][] sparse = twoDimensionalToSparse();
int[][] two = new int[sparse[0][0]][sparse[0][1]];
for (int i = 1; i < sparse.length; i++) {
two[sparse[i][0]][sparse[i][1]] = sparse[i][2];
}
traverse(two);
}
复制代码
1.4.42次元配列のトラバース
public static void traverse(int[][] array) {
for (int[] row : array) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
}
复制代码
2つのキュー
- キューは特殊な種類の線形テーブルです。特別な機能は、テーブルの前面での削除操作とテーブルの背面での挿入操作のみを許可することです。スタックと同様に、キューは線形制約テーブルの対象となる操作です。挿入操作を実行する端はキューの末尾と呼ばれ、削除操作を実行する端はキューの先頭と呼ばれます。
2.1キューのアプリケーションシナリオ
- 例:銀行の預金と引き出し、病院への電話などはキューと見なされます
2.2キューの基本的な紹介
- キューは順序付きリストであり、配列またはリンクリストを使用して実装できます。
- 先入れ先出しの原則に従います。つまり、最初にキューに格納されたデータを最初に取り出す必要があり、後で格納されたデータが取り出されます。
2.3一方向キューシミュレーションの実装
2.3.1配列を使用してキューをシミュレートする
public class ArrayImitateQueue {
private int maxSize;
private int front;
private int rear;
private int[] arr;
public ArrayImitateQueue(int maxSize) {
this.maxSize = maxSize;
arr = new int[maxSize];
front = -1;
rear = -1;
}
public boolean isFull() {
return rear == maxSize - 1;
}
public boolean isEmpty() {
return rear == front;
}
public void addQueue(int num) {
if (isFull()) {
System.err.println("队列已满不能添加数据");
return;
}
rear++;
arr[rear] = num;
}
public int getQueue() {
if (isEmpty()) {
throw new RuntimeException("ERROR:index out of bounds");
}
front++;
return arr[front];
}
public void showQueue() {
if (isEmpty()) {
System.err.println("Queue is Null~");
return;
}
for (int i : arr) {
System.out.println(i);
}
}
public int getFirstQueue() {
if (isEmpty()) {
throw new RuntimeException("ERROR:index out of bounds");
}
return arr[front + 1];
}
}
复制代码
2.3.2リンクリストを使用してキューをシミュレートする
public class ChainImitateQueue<T> {
private Node first;
private Node last;
private int n;
public void addQueue(T item) {
Node oldLast = last;
last = new Node();
last.item = item;
last.next = null;
if (isEmpty()) {
first = last;
} else {
oldLast.next = last;
}
n++;
}
public T removeQueue() {
if (isEmpty()) {
throw new RuntimeException("ERROR: There is no more data in the queue to delete");
}
T item = first.item;
first = first.next;
n--;
return item;
}
public boolean isEmpty() {
return n == 0 ? true : false;
}
public int size() {
return n;
}
class Node {
Node next;
T item;
}
public static void main(String[] args) {
ChainImitateQueue<Integer> queue = new ChainImitateQueue<>();
queue.addQueue(10);
queue.addQueue(100);
System.out.println(queue.size());
System.out.println(queue.removeQueue());
System.out.println(queue.removeQueue());
System.out.println(queue.size());
System.out.println(queue.removeQueue());
}
}
复制代码
2.4循環キューシミュレーションの実装