簡體   English   中英

具有高效查詢算法的層次結構數據結構

[英]Hierarchy data structure wih efficient query algorithm

我正在尋找一種數據結構來表示Java中的層次結構類系統。 例如,我有三個班級,大學,專業,學生,他們的關系如下所示。 在此處輸入圖片說明

是否可以使用類似路徑的表達式查詢有效的數據結構? 例如,如果表達式為CMU / cs / jake,則得到一個名為jake的學生類實例。 據我所知,特里可以做到這一點,還有其他選擇嗎?

如果您的數據適合內存,則可以通過在層次結構的每個節點中放置一Set子代,然后遍歷這些集以確定路徑是否有效來實現此目的。

class University {
  private Set<Major> majors;
}

class Major {
  private Set<Student> students;
}

class Main {
  // true if the path is valid, else false
  public boolean query(University university, Major major, Student student) {
    return university.getMajors().contains(major) &&
      major.getStudents().contains(student);
  }
}

如果您還需要走相反的道路(即,如果您需要雙向層次結構),則可以在每個孩子中放置一Set父母。

這將在平均情況運行O(d)其中d是如果你使用的層次結構的深度HashSets ,而在最壞的情況下O(d * lg(n))其中n是集合的大小,如果你使用TreeSets

如果您的數據不適合內存,那么您可能要考慮使用圖形數據庫,例如Neo4j


編輯:可以通過在每個級別使用Map<String, E>來使代碼更通用,而無需擔心類型安全,前提是每個對象都具有唯一的名稱或其他字符串標識符。

abstract class Hierarchical<E extends Hierarchical> {
  protected final Map<String, E> children;

  public boolean query(Queue<String> query) {
    String key = query.poll();
    if(key != null) {
      E value = map.get(key);
      if(value != null) {
        return query.isEmpty() || value.contains(query);
      }
    }
    return false;
  }
}

class University extends Hierarchical<Major> {}

class Major extends Hierarchical<Student> {}

// special case for the bottom of the hierarchy
class Student extends Hierarchical<Hierarchical> {
  public Student() {
    children = null;
  }

  @Override
  public boolean query(Queue<String> query) {
    throw new UnsupportedOperationException("query should never reach this depth");
  }
}

class Main {
  // true if the path is valid, else false
  public boolean query(Hierarchial root, Queue<String> query) {
    return root.contains(query);
  }
}

這具有相同的運行時,具體取決於您使用的是HashMap還是TreeMap 該查詢僅由字符串隊列組成; 在層次結構的每個級別上,刪除第一個字符串,查詢Map並返回子節點(如果找到),然后查詢繼續進行到子節點,直到隊列為空(返回true)或未找到節點(返回假)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM