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 在 数据结构
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.