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

Java Data Structures (Most Efficient Structure For Specific Program)

课本练习题:

一家医院可容纳n名患者。每次有病人进来时,他都会接受评估,如果情况不危急,就必须等待轮到他。如果情况危急,他将被转移为下一个接受治疗的人。如果呼叫时患者在洗手间,则跳过轮到他并被视为新患者。 在任何时候,医院都需要知道谁在接受治疗,还有剩余的容量。

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

  1. Deque:这将是一个不错的选择,因为您可以在 O(1) 时间内从行的 front/end 中 add/remove,并且可以跟踪患者的数量使用整数变量,因此获取行的大小将是 O(1)。您还可以通过在添加患者之前检查行的大小来确保最大容量为 N。
  2. 数组:由于您需要添加到行的开头,因此普通数组不是一个好的选择,因为您必须将所有元素移动 1 个位置才能在数组的开头腾出空间.这会给你 O(n) 添加到行的前面。
  3. 循环数组:这将是最好的选择,因为一个小原因比双端队列更好...因为它有一个底层数组,所有的内存位置(排队的病人的位置)是连续的,而对于使用底层链表实现的出列,内存位置是随机的且不连续的。这提供了一个小好处。您可以创建一个大小为 N(医院容量)的数组,并反复使用相同的内存位置。如果医院没有容量(无限数量的患者可以排队),那么您将需要使用出队(因为数组具有固定长度)。 front/back 中的 Adding/removing 就像双端队列一样是 O(1),并且获取行的大小也是 O(1),因为您可以使用 start/end 的索引来计算它该行。
  4. 数组 + 堆栈:这不会比仅数组(#2)提供任何好处,因为堆栈是无用的(参见#5)。
  5. 堆栈:由于您需要在行首和行尾都添加,因此堆栈不起作用(它只能添加到一侧)。

所以从最好到最差的顺序是:3、1、2、4、5。

除#5 外,其他均可使用。