在访谈期间设计简单贪婪蛇游戏的数据结构

时间:2015-09-13 04:21:22

标签: java c++ data-structures

这不是一个实际的问题,我只是想在这里讨论和学习数据结构设计,我听说谷歌在现场采访时提出了这个问题。请告诉我如何改进我的设计,谢谢!

一开始我想使用双端队列存储蛇身体部位的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设计中是否有任何缺陷或者任何人有更好的想法分享?

1 个答案:

答案 0 :(得分:1)

我只想使用unordered_set。您的顾虑是:

  • 快速插入新头 - 对于unordered_set,这是O(1)。
  • 快速删除现有尾部 - 对于unordered_set,这是O(1)。
  • 没有重复(检查头部与身体相交) - 这是有保证的 for unordered_set(它不允许重复)。

插入新头时,您无需做任何特殊操作来检查它是否与身体相交;如果有错误,你会收到错误。