[英]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.