Skip to content

Commit 29438ab

Browse files
committed
add Minimize Lateness & Huffman Code
1 parent bab74f4 commit 29438ab

File tree

3 files changed

+328
-1
lines changed

3 files changed

+328
-1
lines changed

05/HuffmanCode.java

+210
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
package hw05;
2+
3+
import java.io.BufferedReader;
4+
import java.io.FileNotFoundException;
5+
import java.io.FileReader;
6+
import java.io.IOException;
7+
import java.util.HashMap;
8+
import java.util.StringTokenizer;
9+
10+
public class HuffmanCode {
11+
private Node[] arr;
12+
private int heapSize;
13+
private String str;
14+
private HashMap<Character, Integer> map;
15+
private Node huffmanTree;
16+
17+
public HuffmanCode(String filePath){
18+
this.str = this.readFile(filePath);
19+
createFrequencyMap();
20+
this.arr = new Node[map.size() + 1];
21+
mapToArr();
22+
this.heapSize = arr.length - 1;
23+
doBuildMinHeap(); // 초기 MinHeap 구성
24+
}
25+
26+
public void huffmanCode(){
27+
for(int i = this.heapSize ; i > 1 ; i--) {
28+
Node left = extractMin(this.arr);
29+
Node right = extractMin(this.arr);
30+
Node newNode = new Node(left.getFrequency() + right.getFrequency(), left, right);
31+
insert(newNode);
32+
}
33+
huffmanTree = this.arr[1];
34+
}
35+
36+
private void createFrequencyMap(){
37+
this.map = new HashMap<Character, Integer>();
38+
String str = this.str;
39+
for(int i = 0; i < str.length(); i++){
40+
char character = str.charAt(i);
41+
if(this.map.containsKey(character)){
42+
int frequency = this.map.get(character);
43+
this.map.put(character, ++frequency);
44+
}else{
45+
this.map.put(character, 1);
46+
}
47+
}
48+
}
49+
50+
public void printHuffmanTree(){
51+
recursionHuffmanTree(huffmanTree, "");
52+
}
53+
54+
private void recursionHuffmanTree(Node root, String code){
55+
if(root != null){
56+
if(root.getLeft() != null && root.getRight() != null){
57+
recursionHuffmanTree(root.getLeft(), code + "0");
58+
recursionHuffmanTree(root.getRight(), code + "1");
59+
}
60+
else{
61+
System.out.println(root.getAlphabet() + ", " + code);
62+
}
63+
}
64+
}
65+
66+
private void insert(Node x){
67+
Node[] temp = new Node[this.heapSize + 2];
68+
for(int i = 1 ; i <= this.heapSize; i++){
69+
temp[i] = arr[i];
70+
}
71+
temp[temp.length - 1] = x;
72+
this.arr = temp;
73+
this.heapSize = temp.length - 1;
74+
buildMinHeap(this.arr);
75+
}
76+
77+
78+
79+
private void mapToArr(){
80+
int i = 1;
81+
for(HashMap.Entry<Character, Integer> elem : map.entrySet()){
82+
arr[i] = new Node(elem.getKey(), elem.getValue());
83+
i++;
84+
}
85+
}
86+
87+
private Node extractMin(Node[] arr){
88+
Node minNode = arr[1];
89+
swap(arr, heapSize, 1);
90+
this.heapSize--;
91+
doBuildMinHeap();
92+
return minNode;
93+
}
94+
95+
public void doBuildMinHeap(){
96+
buildMinHeap(this.arr);
97+
}
98+
99+
100+
private void buildMinHeap(Node[] arr){
101+
for(int i = (this.heapSize) / 2 ; i > 0 ; i--){
102+
minHeapify(arr, i);
103+
}
104+
}
105+
106+
private void minHeapify(Node[] arr, int i){
107+
int smallest;
108+
int leftChildIdx = getLeftChildIdx(i);
109+
int rightChildIdx = getRightChildIdx(i);
110+
if(this.heapSize >= leftChildIdx && arr[leftChildIdx].frequency < arr[i].frequency){
111+
smallest = leftChildIdx;
112+
}else{
113+
smallest = i;
114+
}
115+
if(this.heapSize >= rightChildIdx && arr[rightChildIdx].frequency < arr[smallest].frequency){
116+
smallest = rightChildIdx;
117+
}
118+
if(smallest != i){
119+
swap(arr, smallest, i);
120+
minHeapify(arr, smallest);
121+
}
122+
123+
}
124+
125+
private void swap(Node[] arr, int i, int j){
126+
Node temp = arr[i];
127+
arr[i] = arr[j];
128+
arr[j] = temp;
129+
}
130+
131+
private int getLeftChildIdx(int parentIdx){
132+
return 2*parentIdx;
133+
}
134+
135+
private int getRightChildIdx(int parentIdx){
136+
return 2*parentIdx+1;
137+
}
138+
139+
140+
private String readFile(String filePath) {
141+
BufferedReader br = null;
142+
StringTokenizer str = null;
143+
StringBuilder sb = null;
144+
String line;
145+
146+
try {
147+
br = new BufferedReader(new FileReader(filePath));
148+
sb = new StringBuilder();
149+
while ((line = br.readLine()) != null) {
150+
sb.append(line);
151+
}
152+
} catch (FileNotFoundException e) {
153+
e.printStackTrace();
154+
} catch (IOException e) {
155+
e.printStackTrace();
156+
} finally {
157+
if (br != null) {
158+
try {
159+
br.close();
160+
} catch (IOException e) {
161+
e.printStackTrace();
162+
}
163+
}
164+
return sb.toString();
165+
}
166+
}
167+
168+
class Node{
169+
private Node left, right;
170+
private char alphabet;
171+
private int frequency;
172+
173+
public Node(char alphabet, int frequency){
174+
this.alphabet = alphabet;
175+
this.frequency = frequency;
176+
this.left = null;
177+
this.right = null;
178+
}
179+
180+
public Node(int frequency, Node left, Node right){
181+
this.alphabet = ' ';
182+
this.frequency = frequency;
183+
this.left = left;
184+
this.right = right;
185+
}
186+
187+
public Node(char alphabet, int frequency, Node left, Node right){
188+
this.alphabet = alphabet;
189+
this.frequency = frequency;
190+
this.left = left;
191+
this.right = right;
192+
}
193+
194+
public Node getLeft() {
195+
return left;
196+
}
197+
198+
public Node getRight() {
199+
return right;
200+
}
201+
202+
public char getAlphabet() {
203+
return alphabet;
204+
}
205+
206+
public int getFrequency() {
207+
return frequency;
208+
}
209+
}
210+
}

05/MinimizeLateness.java

+117
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package hw05;
2+
3+
import java.io.BufferedReader;
4+
import java.io.FileNotFoundException;
5+
import java.io.FileReader;
6+
import java.io.IOException;
7+
import java.util.StringTokenizer;
8+
9+
import static java.lang.Math.max;
10+
11+
public class MinimizeLateness {
12+
private Job[] arr;
13+
14+
public MinimizeLateness(String filePath){
15+
String data = this.readFile(filePath);
16+
StringTokenizer str = new StringTokenizer(data, " |\n");
17+
arr = new Job[Integer.parseInt(str.nextToken())];
18+
for(int i = 0; str.hasMoreTokens(); i++){
19+
arr[i] = new Job(Integer.parseInt(str.nextToken()), Integer.parseInt(str.nextToken()));
20+
}
21+
}
22+
23+
public int doMinimizeLateness(){
24+
return minimizeLateness(this.arr);
25+
}
26+
27+
private int minimizeLateness(Job[] arr){
28+
quickSort(arr, 0, arr.length-1);
29+
int time = 0;
30+
int lateness = 0;
31+
for(int i = 0; i<arr.length; i++){
32+
int startTime = time;
33+
int takingTime = arr[i].getJobTakingTime();
34+
int scheduledEndTime = arr[i].getDeadLineTime();
35+
int finishTime = time + takingTime;
36+
time = finishTime;
37+
lateness = max(lateness, finishTime - scheduledEndTime);
38+
}
39+
return lateness;
40+
}
41+
42+
private int partition(Job[] arr, int p, int r){
43+
int target = arr[r].getDeadLineTime();
44+
int i = p-1;
45+
int j = p;
46+
while(j <= r-1){ // j가 끝 인덱스 전까지 탐색하도록
47+
if(arr[j].getDeadLineTime() <= target){
48+
i++;
49+
swap(arr, i, j);
50+
}
51+
j++;
52+
}
53+
i++;
54+
swap(arr, i, j);
55+
return i;
56+
}
57+
58+
private void swap(Job[] arr, int i, int j){
59+
Job temp = arr[i];
60+
arr[i] = arr[j];
61+
arr[j] = temp;
62+
}
63+
64+
private void quickSort(Job[] arr, int p, int r){
65+
if(p < r){
66+
int pivotIndex = partition(arr, p, r);
67+
quickSort(arr, p, pivotIndex-1);
68+
quickSort(arr, pivotIndex+1, r);
69+
}
70+
}
71+
72+
private String readFile(String filePath) {
73+
BufferedReader br = null;
74+
StringTokenizer str = null;
75+
StringBuilder sb = null;
76+
String line;
77+
78+
try {
79+
br = new BufferedReader(new FileReader(filePath));
80+
sb = new StringBuilder();
81+
while ((line = br.readLine()) != null) {
82+
sb.append(line+"\n");
83+
}
84+
} catch (FileNotFoundException e) {
85+
e.printStackTrace();
86+
} catch (IOException e) {
87+
e.printStackTrace();
88+
} finally {
89+
if (br != null) {
90+
try {
91+
br.close();
92+
} catch (IOException e) {
93+
e.printStackTrace();
94+
}
95+
}
96+
return sb.toString();
97+
}
98+
}
99+
100+
class Job{
101+
private int jobTakingTime, deadLineTime;
102+
103+
public Job(int time, int deadLine){
104+
this.jobTakingTime = time;
105+
this.deadLineTime = deadLine;
106+
}
107+
108+
private int getJobTakingTime(){
109+
return jobTakingTime;
110+
}
111+
112+
private int getDeadLineTime(){
113+
return deadLineTime;
114+
}
115+
}
116+
}
117+

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Algorithm
2-
*****
32
1. BinaryInsertionSort / InsertionSort / MergeSort
43
2. HeapSort / QuickSort
54
3. Closest Pair of Points / Loop Invariant
65
4. Counting Inversion / Karatsuba
6+
5. Minimize Lateness / Huffman Code

0 commit comments

Comments
 (0)