Java数据结构(特定程序的最高效结构)

时间:2018-10-03 23:35:32

标签: java arrays stack queue deque

教科书练习中的问题:

一家医院可容纳n名患者。每次患者进来都会对其进行评估,如果处于非紧急状态,则必须等待轮到他。如果处于危急状态,他将被转移为下一个要治疗的人。如果患者在呼叫时在洗手间内,他会跳过转弯处并被视为新患者。 在任何时候,医院都需要知道谁在接受治疗以及剩下的容量多少。

使用(可以选择多个答案)解决此问题是否会更加有效: 1.双端队列 2.数组 3.圆周阵列 4.自定义数据结构:数组+堆栈 5.堆叠

1 个答案:

答案 0 :(得分:2)

  1. Deque:这将是一个不错的选择,因为您可以在O(1)的时间内在行的前端/后端进行添加/删除操作,并且可以使用整数变量来跟踪患者的数量,因此得到的行的大小将是O(1)。您还可以通过在添加患者之前检查行的大小来确保最大容量为N。
  2. 数组:由于您需要添加到行的开头,因此普通数组将不是一个好的选择,因为您必须将所有元素移至1个位置才能在数组的开头留出空间。这样您就可以将O(n)添加到行的开头。
  3. 圆形阵列:这是最好的选择,由于一个小原因,它比双端队列好。因为它具有底层阵列,所以所有内存位置(排队的患者点)都是连续的,而通过使用基础链表实现的出队,内存位置是随机的并且不连续。这提供了一个小的好处。您可以创建大小为N(医院的容纳人数)的数组,并反复使用相同的内存位置。如果没有足够的医院容量(可以排队的病人数量不限),则您需要使用出队(因为阵列的长度已设置)。就像双端队列一样,从前/后添加/删除是O(1),而获得行的大小也是O(1),因为您可以使用行的开始/结束索引来计算它。
  4. 数组+堆栈:仅使用数组(#2)不会带来任何好处,因为堆栈是无用的(请参阅#5)。
  5. 堆栈:由于您需要同时添加到行的开头和结尾,所以堆栈将无法工作(只能添加到一侧)。

所以从好到坏的顺序依次是:3、1、2、4、5。

除#5外,所有其他功能都可以使用。