我如何为箱子的存量建立数据结构,以便我可以尽可能高效地实施以下方法?
所有盒子的底边都是正方形(长=宽),但不一定是立方体(高度不一定等于长=宽)。
功能是
INSERTBOX(side,height)(side = length = width)-在数据结构中插入一个新盒子
REMOVEBOX(侧面,高度)-从库存中删除一个盒子
GETBOX( side , height )-返回最小体积的盒子,其长度至少为 side ,高度至少为高度
CHECKBOX( side , height )-检查数据结构中是否有一个框,其长度至少为 side 及其长度高度至少为高度
我认为实现这一点的方法是通过带有音量键的RB树,但是如果我找到具有所需音量的盒子,我不知道如何在那些潜在的盒子中找到(最小体积的子树)尺寸符合要求的最小尺寸。
有任何提示吗?这是正确的方法吗?还是我应该考虑其他数据结构?
答案 0 :(得分:0)
我认为这个问题不需要复杂的数据结构
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Box {
private int side;
private int height;
private int volume;
public Box(final int side, final int height) {
this.side = side;
this.height = height;
this.volume = side * height;
}
public static String getKey(final int side, final int height) {
return side + "_" + height;
}
public int getSide() {
return side;
}
public int getHeight() {
return height;
}
public int getVolume() {
return height;
}
@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
final Box box = (Box) o;
return side == box.side &&
height == box.height;
}
@Override
public int hashCode() {
return Objects.hash(side, height);
}
}
public class StockOfBoxes {
private Map<String, Box> dictionary = new HashMap<>();
public void insert(int side, int height) {
dictionary.put(Box.getKey(side, height), new Box(side, height));
}
public void remove(int side, int height) {
dictionary.remove(Box.getKey(side, height));
}
public Box get(int side, int height) {
List<Box> filtered = dictionary
.values()
.stream()
.filter(b -> b.getHeight() >= height && b.getSide() >= side)
.collect(Collectors.toList());
Box boxWithMinVolume = null;
for (Box box: filtered) {
if (boxWithMinVolume == null || boxWithMinVolume.getVolume() > box.getVolume()) {
boxWithMinVolume = box;
}
}
return boxWithMinVolume;
}
public boolean check(int side, int height) {
return dictionary
.values()
.stream()
.anyMatch(b -> b.getHeight() >= height && b.getSide() >= side);
}
}
方法的时间复杂度:
插入-O(1)
删除-O(1)(请参阅this)
获取-O(n)
检查-O(n)
我认为没有任何数据结构可以让您改善这一数字。即使您以某种方式改进了获取/检查功能,也会导致插入的时间复杂度降低。