데이터 집합을 반복하는 동안, 정렬 된 순서로, 지금까지 오직 상위 10 개 번호를 추적하는 가장 좋은 방법은 무엇입니까?유지하는 가장 큰 10 개 번호
솔루션 ... 같은 슬프게도 그들은 코드에 어떤 gauruntees가 .... 자바 라이브러리 또는 쉽게 인터넷을 사용할 수 없습니다 ... 일반 최소 및 최대 힙을 구현까지 종료 ...
import java.util.ArrayList;
public class MaxHeapGeneric <K extends Comparable> {
//ArrayList to hold the heap
ArrayList<K> h = new ArrayList<K>();
public MaxHeapGeneric()
{
}
public int getSize()
{
return h.size();
}
private K get(int key){
return h.get(key);
}
public void add(K key){
h.add(null);
int k = h.size() - 1;
while (k > 0){
int parent = (k-1)/2;
K parentValue = h.get(parent);
//MaxHeap -
//for minheap - if(key > parentValue)
if(key.compareTo(parentValue) <= 0) break;
h.set(k, parentValue);
k = parent;
}
h.set(k, key);
}
public K getMax()
{
return h.get(0);
}
public void percolateUp(int k, K key){
if(h.isEmpty())
return ;
while(k < h.size() /2){
int child = 2*k + 1; //left child
if( child < h.size() -1 && (h.get(child).compareTo(h.get(child+1)) < 0) )
{
child++;
}
if(key.compareTo(h.get(child)) >=0) break;
h.set(k, h.get(child));
k = child;
}
h.set(k, key);
}
public K remove()
{
K removeNode = h.get(0);
K lastNode = h.remove(h.size() - 1);
percolateUp(0, lastNode);
return removeNode;
}
public boolean isEmpty()
{
return h.isEmpty();
}
public static void main(String[] args)
{
MaxHeapGeneric<Integer> test = new MaxHeapGeneric<Integer>();
test.add(5);
test.add(9);
test.add(445);
test.add(1);
test.add(534);
test.add(23);
while(!test.isEmpty())
{
System.out.println(test.remove());
}
}
}
그리고
import java.util.ArrayList;
public class MinHeapGeneric <K extends Comparable> {
//ArrayList to hold the heap
ArrayList<K> h = new ArrayList<K>();
public MinHeapGeneric()
{
}
public int getSize()
{
return h.size();
}
private K get(int key){
return h.get(key);
}
public void add(K key){
h.add(null);
int k = h.size() - 1;
while (k > 0){
int parent = (k-1)/2;
K parentValue = h.get(parent);
//for minheap - if(key > parentValue)
if(key.compareTo(parentValue) > 0) break;
h.set(k, parentValue);
k = parent;
}
h.set(k, key);
}
public K getMax()
{
return h.get(0);
}
public void percolateUp(int k, K key){
if(h.isEmpty())
return ;
while(k < h.size() /2){
int child = 2*k + 1; //left child
if( child < h.size() -1 && (h.get(child).compareTo(h.get(child+1)) >= 0) )
{
child++;
}
if(key.compareTo(h.get(child)) < 0) break;
h.set(k, h.get(child));
k = child;
}
h.set(k, key);
}
public K remove()
{
K removeNode = h.get(0);
K lastNode = h.remove(h.size() - 1);
percolateUp(0, lastNode);
return removeNode;
}
public boolean isEmpty()
{
return h.isEmpty();
}
public static void main(String[] args)
{
MinHeapGeneric<Integer> test = new MinHeapGeneric<Integer>();
test.add(5);
test.add(9);
test.add(445);
test.add(1);
test.add(534);
test.add(23);
while(!test.isEmpty())
{
System.out.println(test.remove());
}
}
}
힙 정렬하거나 링크 목록을. – iamsleepy
링크 된 목록 또는 배열입니다. –