DataStructure用于存储元素并按其使用频率/时间戳的顺序对其进行排序

时间:2016-10-02 14:16:18

标签: java algorithm data-structures

我有一个问题陈述:假设有Employee类,并且必须设计一个类,它提供了访问和添加员工的get和put方法。 Employee类是第三方类,因此我们无法对其进行更改。有一个内存限制,例如可以存储最多50,000名员工。现在,如果在添加员工时达到内存限制,则按照以下任一方法删除一名员工并添加新员工:

  1. 基于访问频率
  2. 基于时间戳。应删除旧时间戳中的一个
  3. 我可以考虑采用两个哈希图: - 一个用于存储员工对象,另一个用员工键,时间戳或频率为值。

    但这不是最佳解决方案。请提供有关哪些数据结构可用于解决此问题的宝贵建议。

1 个答案:

答案 0 :(得分:0)

只需使用普通集合来存储您的员工。添加新员工并检测到内存已满时,您只需确定具有最小排序顺序条件的员工,并将其从数据库中删除。

由于你没有提供Employee类,我在这里声明了一个例子:

class Employee {
    int frequency;
    Instant lastAccess;
}

您的数据库(也可以是LinkedList):

private List<Employee> myDatabase = new ArrayList<>();

评估具有最小标准的员工的组件(第一个频率进行比较,如果等于lastAccess,则进行比较:

public int compare( Employee emp1, Employee emp2 )
{
    int result = emp1.frequency - emp2.frequency;
    if ( result == 0 )
    {
        result = emp1.lastAccess.compareTo( emp2.lastAccess );
    }
    return result;
}

这里主要是&#39;将新员工插入数据库的方法(isMemoryFull的实现留给您):

private void insertEmp( Employee emp)
{
    if ( isMemoryFull() )
    {
        Employee minEmp = myDatabase.stream().min( this::compare ).get();
        myDatabase.remove( minEmp);
    }

    myDatabase.add( emp );
}

注意:这适用于Java8 lambdas和流。对于java&lt; 8你必须正式将比较方法作为Comparator实现,并使用Collections.sort而不是stream()。min()方法。