这不是一个实际问题,我只想在这里讨论和学习数据结构设计,听说Google在面试中会问到这个问题。请指导我如何改进我的设计,谢谢!
起初,我想使用双端队列来存储蛇身体部分的x、y坐标对。
deque<pair<x, y>> snakeBodyParts;
因为蛇在移动中很容易推前,所以创建新的坐标对作为新头部基于旧的头部位置和当前方向,然后从后面弹出以删除尾部。通过这种方式移动、吃和检查头部是否碰到墙壁都是O(1)的操作,并且可以使用队列(deque)轻松实现。但是检查新头部位置是否与蛇身重叠将需要循环遍历所有身体部位的位置 - O(L)时间复杂度,其中L是身体部分的数量。
为了改进它,我考虑将所有坐标放入无序集合(C++)或哈希集合(Java),同时仍保持我的旧队列,这可以使我以O(1)的时间检查头部是否撞到身体。但我不知道这是否是个好主意,因为它几乎会将内存和代码量增加一倍,每当我添加/删除队列时,我都需要对我的哈希集合进行操作。
unordered_set<pair<int, int>, pair_hash> bodyPartsSet;
我曾考虑过创建一种类似于链表的结构,不同之处在于它指向前一个节点:
SnakeBodyNode {
int x;
int y;
SnakeBodyNode * prev;
}
然后我还需要两个指向头和尾的指针,以及一个方向变量。
SnakeBodyNode * head;
SnakeBodyNode * tail;
char dir;
然而我并没有看到这种方法的任何优点,仍然需要哈希来实现O(1)的检查头是否碰撞身体。
我的双端队列+哈希的设计中是否存在缺陷,或者有更好的想法可以分享吗?
8位
微处理器上非常快速。 - Galik