sách gpt4 ăn đã đi

Giải thích từ điển nén và giải nén thuật toán LZW nén Java

In lại Tác giả: qq735679552 Thời gian cập nhật: 28-09-2022 22:32:09 27 4
mua khóa gpt4 giày nike

CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.

Bài viết trên blog CFSDN Giải thích nén và giải nén từ điển thuật toán Java Compression LZW này được tác giả sưu tầm và biên soạn. Nếu các bạn quan tâm tới bài viết này thì nhớ like nhé.

Quá trình nén:

Tôi đã viết một bài về nén Huffman trước đây. Sự khác biệt giữa nén từ điển lzw và nén Huffman là việc mã hóa không cần phải ghi vào tệp. Bảng mã hóa được tạo bằng cách đọc tệp. được kết hợp với các số tương ứng được lưu trữ trong bảng băm dưới dạng bảng mã cơ bản.

Giải thích từ điển nén và giải nén thuật toán LZW nén Java

Hậu tố ở đây là hiện tại.

Nếu tiền tố + hậu tố tồn tại trong bảng mã thì tiền tố bằng tiền tố + hậu tố. Nếu chưa tồn tại thì ghi chuỗi biểu thị bằng tiền tố + hậu tố vào bảng mã hóa, đồng thời ghi tiền tố vào file nén. Điều quan trọng cần lưu ý ở đây là phạm vi số có thể được biểu thị bằng một byte là 0-255, vì vậy chúng tôi thay đổi mã hóa của một ký tự thành hai byte và ghi tám bit cao và tám bit thấp tương ứng, chẳng hạn như 256 That là 00000001 11111111 Phương thức dos.writechar(256) trong đối tượng dataoutputstream dos được sử dụng ở đây.

Phạm vi mà hai byte có thể biểu thị là 0-65535. Khi mã hóa của chúng tôi vượt quá phạm vi này, chúng tôi cần đặt lại bảng mã hóa và mã hóa lại.

quá trình giải nén.

Giải thích từ điển nén và giải nén thuật toán LZW nén Java

cw đại diện cho ký tự đã đọc, pw là cw của dòng trước, cw bảng mã hóa lại tồn tại: p→pw, c→cw ký tự đầu tiên, đầu ra cw. cw không tồn tại trong bảng mã hóa, ký tự đầu tiên của p→pw, c→pw được xuất ra dưới dạng p+c.

Khi đọc 65535, chúng ta đặt lại bảng mã và mã hóa lại.

phần mã.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
công cộng lớp học yasuo {
  riêng tư số nguyên bianma = 256 ; // mã hóa
  riêng tư tiền tố chuỗi = "" ; // tiền tố
  riêng tư hậu tố chuỗi = "" ; // hậu tố
  riêng tư chuỗi trung kiến ​​= "" ; // biến trung gian
  hashmap hm = mới hashmap(); // bảng mã hóa
  riêng tư tĩnh đường dẫn chuỗi = "d:\\java\\Nén từ điển\\ziidianyasuo.txt" ; // File cần nén
  riêng tư tĩnh chuỗi path2 = "d:\\java\\Nén từ điển\\yasuo.txt" ; //tập tin được giải nén
  riêng tư tĩnh chuỗi path3 = "d:\\java\\Nén từ điển\\jieya.txt" ; //tập tin được giải nén
  công cộng tĩnh vô hiệu main(chuỗi[] args) ném ngoại lệ io {
  /**
   * Nén
   */
  yasuo yasuo = mới yasuo();
  yasuo.yasuo();
  /**
   * Giải nén
   */
  jieya jie = mới jieya();
  jie.jieya(path2,path3);
  }
  công cộng vô hiệu yasuo() ném ngoại lệ io {
  //Tạo luồng đầu vào tập tin
  luồng đầu vào là = mới fileinputstream(đường dẫn);
  byte [] bộ đệm = mới byte [is.available()]; //Tạo vùng đệm
  is.read(bộ đệm); //Đọc tất cả các byte của tập tin
  chuỗi str = mới chuỗi(bộ đệm); // Xử lý byte
  is.close(); // đóng luồng
  //Tạo luồng đầu ra của tệp
  luồng đầu ra os = mới fileoutputstream(đường dẫn2);
  luồng dữ liệu đầu ra dos = mới luồng dữ liệu đầu ra(os);
// system.out.println(chuỗi);
  // Đưa 256 mã ascll cơ bản nhất vào bảng mã hóa
  ( số nguyên tôi = 0 ; tôi < 256 ; tôi++) {
   char ch = ( char ) Tôi;
   chuỗi st = ch + "" ;
   hm.put(st, i);
  }
  ( số nguyên tôi = 0 ; i < độ dài chuỗi(); i++) {
   nếu như (bianma== 65535 ){
   hệ thống.out.println( "cài lại" );
   dos.writechar( 65535 ); // Viết -1 đại diện cho việc đặt lại và in bảng mã
   hm. xóa(); //Xóa bản đồ băm
   ( số nguyên j = 0 ; j < 256 ; j++) { //Viết lại 256 mã cơ bản
    char ch = ( char ) j;
    chuỗi st = ch + "" ;
    hm. đặt(st, j);
   }
   tiền tố= "" ;
   bianma= 0 ;
   }
   char ch = str.charat(i);
   chuỗi s = ch + "" ;
   hậu tố = s;
   trung kiến ​​= tiền tố + hậu tố;
   nếu như (hm.get(trung kiên) == vô giá trị ) { // Nếu không có bảng mã nào có tiền tố và hậu tố trong bảng mã
// system.out.print(zhongjian);
// system.out.println("Mã hóa tương ứng là " + bianma);
   hm.put(zhongjian, bianma); //Thêm tiền tố cộng hậu tố và mã hóa tương ứng vào bảng mã
// system.out.println(" " + tiền tố);
// system.out.println("Mã hóa bằng văn bản"+hm.get(perfix));
   dos.writechar(hm.get(tiền tố)); // Ghi tiền tố vào file nén
   biama++;
   tiền tố = hậu tố;
   } khác { // Nếu có tiền tố tiếp theo thì lưu tiền tố trước cộng hậu tố
   tiền tố = trung giám;
   }
   nếu như (i == chiều dài chuỗi() - 1 ) { //Viết cái cuối cùng vào
// system.out.print("Viết cái cuối cùng"+perfix);
   dos.writechar(hm.get(tiền tố));
// system.out.println(" "+hm.get(tiền tố));
   }
  }
  os. đóng(); // đóng luồng
// system.out.println(hm.tostring()); // Bảng mã đầu ra
  }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
công cộng lớp học jieya {
  riêng tư arraylist danh sách = mới arraylist(); // Lưu tám bit trên
  riêng tư số nguyên đếm = 0 ; // chỉ số dưới
  riêng tư arraylist numlist = mới danh sách mảng<>(); // Lưu mã
  hashmap hm = mới bản đồ băm <>(); // bảng mã hóa
  hashmap hm1 = mới bản đồ băm <>(); // bảng mã hóa
  riêng tư chuỗi cw = "" ;
  riêng tư chuỗi pw = "" ;
  riêng tư chuỗi p = "" ;
  riêng tư chuỗi c = "" ;
  riêng tư số nguyên bianma = 256 ;
  công cộng vô hiệu jieya(đường dẫn chuỗi, đường dẫn chuỗi1) ném ngoại lệ io {
  //Đọc file nén
  luồng đầu vào là = mới fileinputstream(đường dẫn);
  byte [] bộ đệm = mới byte [is.available()];
  is.read(bộ đệm);
  is.close(); // đóng luồng
  chuỗi str = mới chuỗi(bộ đệm);
  // system.out.println(chuỗi);
  // Đọc 8 bit trên và đưa số được biểu thị bằng 8 bit trên vào danh sách
  ( số nguyên tôi = 0 ; i < chiều dài bộ đệm; i += 2 ) {
   số nguyên a = bộ đệm[i];
   danh sách.thêm(a); // Tám bit trên được lưu trữ trong danh sách
  }
  ( số nguyên tôi = 1 ; i < chiều dài bộ đệm; i += 2 ) { //Đọc 8 bit thấp hơn
   // system.out.println(danh sách.get(đếm)+"---");
   nếu như (bộ đệm[i] == - 1 && bộ đệm[i - 1 ] == - 1 ) {
   numlist.add( 65535 );
   } khác {
   // hệ thống.out.println(i);
   nếu như (list.get(đếm) > 0 ) { // Nếu 8 bit dưới tương ứng với 8 bit trên là 1
    nếu như (bộ đệm[i] < 0 ) {
    số nguyên a = bộ đệm[i] + 256 + 256 * list.get(đếm);
    // bộ đệm[i]+=256+256*danh sách.get(đếm);
    numlist.add(a); // Lưu trữ trong danh sách số
    } khác {
    số nguyên a = bộ đệm[i] + 256 * (list.get(đếm));
    // system.out.println(bộ đệm[i]+" "+a + "+++");
    numlist.add(a); // Lưu trữ trong danh sách số
    }
   } khác { // Tám bit trên là 0
    // system.out.println(bộ đệm[i]);
    numlist.add(( số nguyên ) bộ đệm[i]); // Lưu trữ trong danh sách số
   }
   đếm++;
   }
  }
  // system.out.println(list.size()+" "+count+" "+numlist.size()+"So sánh kích thước"+"
  // "+buffer.length);
  // cho(int i=0;i<>
  // system.out.println(numlist.get(i)+"p");
  // }
  /**
   * Mã hóa 0-255 ký tự
   */
  ( số nguyên tôi = 0 ; tôi < 256 ; tôi++) {
   char ch = ( char ) Tôi;
   chuỗi st = ch + "" ;
   hm.put(st, i);
   hm1.put(i, st);
  }
  /**
   * Bắt đầu mã hóa lại theo các thành phần trong hàng đợi danh sách số và xuất tệp
   */
  //Tạo luồng đầu ra
  luồng đầu ra os = mới fileoutputstream(đường dẫn1);
  // Duyệt qua danh sách số
  ( số nguyên tôi = 0 ; i < kích thước danh sách số(); i++) {
   số nguyên n = numlist.get(i);
   nếu như (hm.chứagiátrị(n) == ĐÚNG VẬY ) { // Nếu nó tồn tại trong bảng mã hóa
   cw = hm1.get(n);
   // hệ thống.out.println(cw+"*");
   nếu như (pw != "" ) {
    os.write(cw.getbytes( "gbk" ));
    p = pw;
    c = cw. charat( 0 ) + "" ; // Cái đầu tiên của c=cw
    // hệ thống.out.println(c+"&");
    hm.put(p + c, bianma);
    hm1.put(bianma, p + c);
    biama++;
   } khác {
    os.write(cw.getbytes( "gbk" )); // Đầu tiên
   }
   } khác { // Không tồn tại trong bảng mã hóa
   p = pw;
   // hệ thống.out.println(pw+"-=");
   c = pw. charat( 0 ) + "" ; // c=cái đầu tiên của pw
   hm.put(p + c, bianma);
   hm1.put(bianma, p + c);
   biama++;
   os.write((p + c).getbytes( "gbk" ));
   cw = p + c;
   }
   pw = cw;
   // hệ thống.out.println(bianma);
   // hệ thống.out.println(cw+"==");
   nếu như (tôi == 65535 ) {
   hệ thống.out.println( "Đặt lại 2" );
   hm. xóa();
   hm1. xóa();
   ( số nguyên j = 0 ; j < 256 ; j++) {
    char ch = ( char ) j;
    chuỗi st = ch + "" ;
    hm. đặt(st, j);
    hm1.put(j, st);
   }
   bianma = 0 ;
   tiền = "" ;
   }
  }
  // hệ thống.out.println(hm1.tostring());
  os. đóng();
  }
}

Nhược điểm: Khi mã hóa vượt quá 65535 thì xử lý không tốt và không thể đặt lại bảng mã. Tệp được khôi phục bắt đầu bị cắt xén ở phần vượt quá 65535. Vẫn cần phải được cải thiện.

Tóm tắt.

Trên đây là toàn bộ nội dung bài viết mong rằng nội dung bài viết có giá trị tham khảo và học tập nhất định cho quá trình học tập, làm việc của mọi người. Nếu bạn muốn biết thêm về nó, vui lòng xem các liên kết liên quan bên dưới.

Liên kết gốc: https://blog.csdn.net/lzq1326253299/article/details/82750568.

Cuối cùng, bài viết giải thích về nén và giải nén từ điển thuật toán LZW của nén Java kết thúc ở đây. Nếu bạn muốn biết thêm về giải thích về nén và giải nén từ điển thuật toán LZW của nén Java, vui lòng tìm kiếm các bài viết CFSDN hoặc tiếp tục duyệt qua các bài liên quan. Bài viết, tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .

27 4 0
qq735679552
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress