#avl-tree #elements #distance #dimension #mutation #tree-search #structure

dlist

基于AVL树实现的列表数据结构。它可以存储具有尺寸的元素,并快速通过距离0搜索元素。

5个版本

0.1.4 2021年4月10日
0.1.3 2021年4月10日
0.1.2 2021年4月10日
0.1.1 2021年4月8日
0.1.0 2021年4月8日

#1410数据结构

Unlicense/MIT

16KB
360 代码行

dlist

基于AVL树的列表数据结构。它可以存储具有尺寸的元素,并通过距离0快速搜索元素。列表的变异和索引为O(logN)。

使用案例

文本编辑器

DList可用于将文本数据拆分为行,并根据绝对文件偏移量计算行/列号


let mut dlist = DList::new(DefaultMeasurer::new() as DefaultMeasurer<usize>);

let line_lengths: Vec<usize> = ... // let's say we have parsed some text file and now have a vector containing the length of each line (in bytes)

for i in 0..line_lengths.len() {
    dlist.append(line_lengths[i]);
}

let line_info = dl.get_by_index(100).unwrap();
assert_eq!(line_info.index, 100);               // a line index. Since we use get_by_index(n), it should always be equal to n.
assert_eq!(line_info.item, 50);                 // in this case an item is of type usize and contains the length of the text line.
assert_eq!(line_info.outer_distance, 1000);     // an absolute file offset of the first character in the line.
assert_eq!(line_info.inner_distance, 0);        // always 0 for get_by_index


let line_info = dl.get_by_distance(10000).unwrap();
assert_eq!(line_info.index, 100);               // a zero-based line index for the distance (i.e. file offset).
assert_eq!(line_info.item, 50);                 // a length of the line which contains this distance.
assert_eq!(line_info.outer_distance, 1000);     // an absolute file offset of the first character in the line.
assert_eq!(line_info.inner_distance, 34);       // an offset inside the slice, i.e. zero-based column offset.

无运行时依赖