我遇到的面试问题涉及Gap Buffer数据结构的实施。特别是,我所说的是一个基本上是LinkedList的数据结构,其中每个Node都是一个(相当小的)char数组。这是文本编辑的理想选择,因为您可以在任何位置插入更多字符,如果没有您要查找的空间,则分配新数组。
实现Gap Buffer本身并不是什么大问题,因为它看起来与LinkedList完全相同,并且实现像Add
和Remove
这样的方法在算法上很简单。如果有空间,只需在对应于该位置的节点中插入新字符,如果需要更多空间,则分配新节点。
最困难的问题是Trim
方法的有效实现,后置条件是当Trim
运行时,Gap Buffer中的所有非空白元素都将被“压缩”到开头也就是说,所有元素都尽可能向前移动,并且空间被修剪掉。
朴素的方法是简单地遍历每个数组元素,将其移动到下一个空闲空间,直到所有元素都被迭代,然后删除列表末尾的所有空节点。但是,这不太理想:
如果在迭代期间我们接近一个空的数组,我们应该立即从列表中删除该数组,从而加入它周围的2个数组。另一方面,如果我们接近一个完全填满的数组,我们应该跳过数组,因为它已经被压缩了。
在效率方面,这两个案例是我们需要考虑的唯一案例吗?还有其他潜在的改进吗?完全有效的Trim
在算法上会是什么样的?
答案 0 :(得分:0)
一个改进是在我们修剪它之后检测到数组是空的。如果它是空的,则只需将其删除,而不是将下一个数组复制到其中。