制作盒子库存的数据结构

时间:2019-01-24 22:17:53

标签: java data-structures

我如何为箱子的存量建立数据结构,以便我可以尽可能高效地实施以下方法?

所有盒子的底边都是正方形(长=宽),但不一定是立方体(高度不一定等于长=宽)。

功能是

INSERTBOX(side,height)(side = length = width)-在数据结构中插入一个新盒子

REMOVEBOX(侧面,高度)-从库存中删除一个盒子

GETBOX( side height )-返回最小体积的盒子,其长度至少为 side ,高度至少为高度

CHECKBOX( side height )-检查数据结构中是否有一个框,其长度至少为 side 及其长度高度至少为高度

我认为实现这一点的方法是通过带有音量键的RB树,但是如果我找到具有所需音量的盒子,我不知道如何在那些潜在的盒子中找到(最小体积的子树)尺寸符合要求的最小尺寸。

有任何提示吗?这是正确的方法吗?还是我应该考虑其他数据结构?

1 个答案:

答案 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)

我认为没有任何数据结构可以让您改善这一数字。即使您以某种方式改进了获取/检查功能,也会导致插入的时间复杂度降低。