2015-04-04 5 views
1
public class Link { 
public int weight; 
public int loc; 
public Link next; 
public boolean visited; 
public Link parent; 

public Link(int d, int loc){ 
    this.weight = d; 
    this.loc = loc; 
    this.visited = false; 
} 
public Link(Link p, int d, int loc){ 
    this.parent = p; 
    this.weight = d; 
    this.loc = loc; 
} 

public void printLink(){ 
    System.out.println(weight); 
} 
} 

class LinkList{ 


public Link first; 

public LinkList(){ 
    first = null; 
} 
public void add(int d, int loc){ 
    Link link = new Link(d, loc); 
    if (first == null){ 
     first = link; 
    } 
    else{ 
     Link curr = first; 
     while (curr.next!=null){ 
      curr = curr.next; 
     } 
     curr.next = link; 
    } 

} 
public void printList(){ 
    Link currentLink = first; 
    System.out.println("List: "); 
    while(currentLink != null) { 
     currentLink.printLink(); 
     currentLink = currentLink.next; 
    } 
    System.out.println(""); 
} 
public boolean isEmpty(){ 
    return first == null; 
} 
public Link delete(){ 
    Link temp = first; 
    first = first.next; 
    return temp; 
} 

} 

public class MinHeap { 
    public Link[] Heap; 
    public int size; 
    public int maxsize; 

    private static final int FRONT = 0; 

    public MinHeap(int maxsize, Link x) 
    { 
     this.maxsize = maxsize; 
     this.size = 0; 
     Heap = new Link[this.maxsize + 1]; 
     Heap[0] = x; 
    } 

    private int parent(int pos) 
    { 
     return pos/2; 
    } 

    private int leftChild(int pos) 
    { 
     return (2 * pos); 
    } 

    private int rightChild(int pos) 
    { 
     return (2 * pos) + 1; 
    } 

    private boolean isLeaf(int pos) 
    { 
     if (pos >= (size/2) && pos <= size) 
     { 
      return true; 
     } 
     return false; 
    } 

    private void swap(int fpos, int spos) 
    { 
     Link tmp; 
     tmp = Heap[fpos]; 
     Heap[fpos] = Heap[spos]; 
     Heap[spos] = tmp; 
    } 

    private void minHeapify(int pos) 
    { 
     if (!isLeaf(pos)) 
     { 
      if (Heap[pos].weight > Heap[leftChild(pos)].weight || Heap[pos].weight > Heap[rightChild(pos)].weight) 
      { 
       if (Heap[leftChild(pos)].weight < Heap[rightChild(pos)].weight) 
       { 
        swap(pos, leftChild(pos)); 
        minHeapify(leftChild(pos)); 
       }else 
       { 
        swap(pos, rightChild(pos)); 
        minHeapify(rightChild(pos)); 
       } 
      } 
     } 
    } 

    public void add(Link element) 
    { 
     Heap[++size] = element; 
     int current = size; 

     while (Heap[current].weight < Heap[parent(current)].weight) 
     { 
      swap(current,parent(current)); 
      current = parent(current); 
     } 
    } 

    public void print() 
    { 
     for (int i = 1; i <= size/2; i++) 
     { 
      System.out.print(" PARENT : " + Heap[i] + " LEFT CHILD : " + Heap[2*i] 
       + " RIGHT CHILD :" + Heap[2 * i + 1]); 
      System.out.println(); 
     } 
    } 

    public void minHeap() 
    { 
     for (int pos = (size/2); pos >= 1 ; pos--) 
     { 
      minHeapify(pos); 
     } 
    } 
    public boolean inQ(Link d){ 
     int x = d.weight; 
     for (int i = 0; i<size;i++){ 
      if (Heap[i].weight == x){ 
       return true; 
      } 
     } 
     return false; 
    } 

    public Link remove() 
    { 
     Link popped = Heap[FRONT]; 
     Heap[FRONT] = Heap[size--]; 
     minHeapify(FRONT); 
     return popped; 
    } 
} 

У меня есть класс мин кучи здесь, в котором хранится ссылка объекты на основании атрибутов веса. Моя цель - иметь возможность напрямую получать и изменять атрибуты объектов, хранящихся в мини-куче. Мне нужно иметь доступ к этим объектам, основанным только на атрибуте loc.
Так, например, я могу захотеть получить доступ к объекту Link с значением loc 6 и изменить его родительские или весовые атрибуты; однако я знаю только, что это значение атрибута loc во время доступа.
Я понимаю, что я должен использовать массив указателей на эти объекты, но я не уверен, как это реализовать.Как получить доступ к объектам в мин куче непосредственно, ява

Спасибо!

+0

вы можете использовать HashMap ; где 'loc' будет работать как ключ – Prashant

+0

Не могли бы вы объяснить, что вы пытаетесь достичь здесь? Куча - это специальная структура данных, используемая для сортировки вывода. Вы не можете добавить или изменить атрибут середины кучи. Почему бы не использовать двоичное дерево? –

ответ

0

Согласно вашему коду, каждая ссылка знает его родительский элемент, а также следующий элемент в списке.

Вы должны следовать приведенному ниже алгоритму и обновить требуемое поле.

  1. Сначала передайте объект связи и значение loc методу, который обновит вес/родитель. Вы можете написать два метода: один для обновления веса и другого, чтобы обновить вес, или у вас может быть один метод и с флагом для выделения активности.

  2. Если вы хотите обновить вес, его простота.

  3. Если вы хотите обновить родительский объект, вы должны передать новый родительский объект также методу, так как вы должны обновить следующий для родителя, но убедитесь, что вы правильно обрабатываете свой код, поскольку вы можете потерять существующий следующий для родителя.

Поскольку вы передаете фактические объекты, jvm будет сохраняться одинаково. Обязательно не передавать значение веса/родителя списка.