我目前正在玩CRF-ish工作的一些想法,我知道我需要帮助。
我有一堆功能对象(想想像神经网一样昂贵的东西)。它们被应用到线性缓冲区(想象一个float
s或byte
s的数组)但是以不同的间隔。所以它们看起来像那样(将开始和结束视为"将对象应用于buf[Start:End]
":
| Object | Start | End |
|--------|-------|-----|
| A | 0 | 4 |
| B | 4 | 10 |
| C | 13 | 15 |
[4:10]
更改为[4:12]
。[4:10]
更改为[3:12]
,则必须将A应用于范围[0:3]
,并且必须将B应用于范围[3:12]
任务可归纳如下:
是否有任何我错过的良好数据结构会使这些任务变得更容易?
我错过了一些非常明显的事情吗?
一位朋友建议我查找增量编译方法,因为它类似。使用的类比是Roslyn将以远程方式解析/重新分析文本片段。这与我的问题非常相似 - 只需使用令牌的线性缓冲区替换浮点数的线性缓冲区。
问题是我无法找到关于Roslyn如何做到这一点的任何有用信息。
答案 0 :(得分:1)
此解决方案的内存效率并不高,但如果我理解正确,它应该允许相对简单地实现您想要的功能。
保留所有函数对象的数组或切片funcs
,以便它们各自具有规范整数索引,并且可以通过该索引查找。
保留一小部分整数s
,它与浮动缓冲区的大小始终相同;它将缓冲区中的特定索引映射到函数片中的“函数索引”。您可以使用-1表示不属于任何间隔的数字。
保留一对(int,int)对intervals
,使intervals[i]
包含存储在funcs[i]
的函数的起始端索引。
我相信这可以让您实现所需的功能而不会有太多麻烦。例如,要按索引i
进行查询,请查找s[i]
,然后返回funcs[s[i]]
和intervals[s[i]]
。当缓冲区发生更改时,也请更改s
,在s
和intervals
切片之间进行交叉引用,以确定相邻的时间间隔是否受到影响。我很乐意更详细地解释这一部分,但我并不完全理解间隔更新的要求。 (当您执行间隔插入时,它是否对应于底层缓冲区中的插入?或者您只是更改哪些缓冲区元素与哪些函数相关联?在这种情况下,插入是否会在下一个间隔开始时导致删除?大多数方案应该有效,但它会改变程序。)