Я работаю над своим назначением, которое должно читать из текстового файла, хранить первые 10 слов в куче. Затем продолжайте читать из текстового файла, и если слово меньше корня кучи, замените его и перетащите всю кучу. Мой код, похоже, работает по большей части, но я сталкиваюсь с несколькими проблемами.Метод кучи структуры данных кучи
- Некоторые слова, даже если они меньше корня не выгружена
- Повторяющиеся слова
Я должен закончить с кучей, содержащей слова abandoning abandons abased abash abashed abashes abasing abate abatement abbe
Однако я получить слова, abashes abashed abash abased abandons abandoning bewilderedly abandoning armful abandoning
Вот мой код до сих пор:
public static void readFile() {
BufferedReader reader;
String inputLine;
int counter = 0;
try {
reader = new BufferedReader(new FileReader(".\\src\\dictionary.txt"));
while((inputLine = reader.readLine()) != null) {
if(counter < 10) {
heap.insert(inputLine);
counter++;
}
if(inputLine.compareTo(heap.find(0)) < 0) {
heap.change(0, inputLine);
}
}
} catch (IOException e) {
System.out.println("Error: " + e);
}
}
public boolean insert(String value) {
if(currentSize == maxSize) { return false; }
Node newNode = new Node(value);
heap[currentSize] = newNode;
trickleUp(currentSize++);
return true;
}
public void trickleUp(int index) {
int parent = (index - 1)/2;
Node bottom = heap[index];
while(index > 0 && heap[parent].getData().compareTo(bottom.getData()) < 0) {
heap[index] = heap[parent];
index = parent;
parent = (parent - 1)/2;
}
heap[index] = bottom;
}
public void trickleDown(int index) {
int largerChild;
Node top = heap[index];
while(index < currentSize/2) {
int leftChild = 2 * index + 1;
int rightChild = index + 1;
if(rightChild < currentSize && heap[leftChild].getData().compareTo(heap[rightChild].getData()) < 0) {
largerChild = rightChild;
} else {
largerChild = leftChild;
}
if(top.getData().compareTo(heap[largerChild].getData()) > 0) {
break;
}
heap[index] = heap[largerChild];
index = largerChild;
}
heap[index] = top;
}
public boolean change(int index, String newValue) {
if(index < 0 || index >= currentSize) { return false; }
String oldValue = heap[index].getData();
heap[index].setData(newValue);
if(oldValue.compareTo(newValue) < 0) {
trickleUp(index);
} else {
trickleDown(index);
}
return true;
}
Что вы уже сделали для себя в связи с проблемой? – bas
на быстрой стороне записки, это задание? Потому что, если это не так: heapsorting только быстрее, чем mergesort, если есть непрерывное добавление элементов. Если вам нужно отсортировать элементы только один раз, функция mergesort (или quicksort) будет более эффективной. – bas
Вы запускаете его поэтапно под отладчиком (если вы используете Eclipse или другую среду IDE)? –