音乐音符搜索与乐谱管理技术解析
1. 红黑树(Red - Black Trees)
红黑树(RB - tree)是一种复杂的搜索机制和算法,常用于需要快速搜索的应用场景。它是一种二叉搜索树,其独特之处在于具有自平衡特性。在节点插入和删除操作时,树中各路径的长度近似最优,为 $O(log(n))$,其中 $n$ 是树中节点的数量。实际上,每个节点到叶子节点的最长路径最多是最短路径的两倍。
红黑树节点在键和值方面与二叉树节点本质相似,但携带了一些额外信息以确保节点平衡。虽然红黑树的技术细节较为复杂,但网上有很多相关的优秀描述。
2. 音符与区间(Notes and Intervals)
音符具有起始位置和持续时间,这两个属性定义了一个数值区间,不要将其与音乐区间混淆。一个区间包含以下三个特征:
- 起始数值
- 结束数值
- 边界策略,定义区间边界,包括:
- 开区间(Open):不包含起始和结束值,写作 $(a, b)$
- 闭区间(Closed):包含起始和结束值,写作 $[a, b]$
- 左开右闭区间(LO_Open):不包含起始值,包含结束值,写作 $(a, b]$
- 左闭右开区间(HI_Open):包含起始值,不包含结束值,写作 $[a, b)$
默认使用的边界策略是 HI_Open,例如,一个音符在精确的时间开始,但在相邻音符开始之前结束。在 Interval
类的方法中,最重要的是 Interval.contains()
用于确定给定区间是否包含特定值,以及 Interval.in