这不是一个实际的问题,我只是想在这里讨论和学习数据结构设计,我听说谷歌在现场采访时提出了这个问题。请告诉我如何改进我的设计,谢谢!
一开始我想使用双端队列存储蛇身体部位的x,y坐标对。
deque<pair<x, y>> snakeBodyParts;
因为当蛇移动时它很容易向前推 - 在新的头部位置和当前方向上创建新的坐标对作为新的头部基础,然后弹回以移除尾部。通过这种方式移动,吃饭,检查头撞墙都是O(1)操作并且易于用deque实现。但是检查新的头部位置是否与蛇体重叠将需要在所有身体部位循环。 position - O(L)时间复杂度,L是身体部位的数量。
为了改进它,我考虑将所有坐标放入unordered_set(C ++)或hashset(Java),同时仍然保留我的旧deque,它可以给我O(1)来检查头部现在是否击中了身体。但我不知道这是不是一个好主意,因为它几乎会增加内存和代码量的两倍,每当我添加/删除deque时,我都需要对我的hashset执行此操作。
unordered_set<pair<int, int>, pair_hash> bodyPartsSet;
我还想过创建自己的结构,就像链表一样,除了它指向上一个节点:
SnakeBodyNode {
int x;
int y;
SnakeBodyNode * prev;
}
然后我还需要两个指向头部和尾部的指针以及一个方向变量。
SnakeBodyNode * head;
SnakeBodyNode * tail;
char dir;
但是我没有看到这方面的任何优势,仍然需要哈希来获取O(1)以检查头部是否击中身体..
我的deque + hash设计中是否有任何缺陷或者任何人有更好的想法分享?
答案 0 :(得分:1)
我只想使用unordered_set。您的顾虑是:
插入新头时,您无需做任何特殊操作来检查它是否与身体相交;如果有错误,你会收到错误。