gpt4 book ai didi

Java:表示大量数据数组

转载 作者:行者123 更新时间:2023-11-29 09:11:07 26 4
gpt4 key购买 nike

对于工作安排应用程序,我需要生成大量可能的 w 周(= 7w 天)的员工安排。员工时间表包含计划期间每一天的类次列表(早类、晚类、晚类、休息日)。该应用程序是用 Java 编写的。

此时,我表示一个员工排类表如下:

public class Schedule
{
/** List with for every day of planning period the assigned shift */
private Shift[] shiftlist = new Shift[Settings.schedule_days];

/** Cost of schedule (for measuring its quality) */
private double cost;

// A list of variables, representing schedule properties
// which are referenced often.
// E.g.: number of workweekends, number of night shifts

// Also some methods for updating / retrieving information
}

Shift 是一个枚举,表示分配的类次,定义为:

public enum Shift
{
DAY, LATE, NIGHT, FREE;
}

我在枚举声明和比较属性的方法中也有一些移位属性,但我认为这与这里无关。

每个员工都有一个可能的时间表列表:

public class Employee
{
/** Large set of possible schedules for planning period */
public LinkedList<Schedule> generated_schedules;

// Variables representing properties of employee
}

我的问题是我实际上有 50 名员工,我想为每位员工生成 100.000 - 1.000.000 个可能的计划。

时间表实际上生成得很快,而且由于我的电脑有 8GB 可用内存,所以我可以存储很多。但是,当为 30--40 名员工生成完后,我的内存就满了。

有人给我的建议是使用字符数组而不是枚举数组来表示分配的类次。这将占用更少的空间。此外,他表示使用 char 数组列表而不是 Schedule 对象列表也更好。但是,不可能将计划属性(例如成本)保存在计划附近的某个位置,并且需要经常重新计算它们。我认为这将是一个严重的缺点。

这个观察是否确实有意义,或者您认为有更好的方法来表达如此大量的数据以使用更少的空间?

最佳答案

如果您确实需要同时在内存中存储所有计划,那么最节省空间的编码是使用每天 2 位的 BitSet。

public class BitSetShiftList {
private BitSet bitset;

public void BitSetShiftList(int size) {
bitset = new BitSet(size * 2);
}

public void setShift(int day, Shift shift) {
int ordinal = shift.ordinal();
assert ordinal >= 0 && ordinal <= 3;

bitset.set(day * 2, (ordinal & 0x1) != 0);
bitset.set(day * 2 + 1, (ordinal & 0x2) != 0);
}

public Shift getShift(int day) {
int ordinal = (bitset.get(day * 2) ? 0x1 : 0x0) |
(bitset.get(day * 2 + 1) ? 0x2 : 0x0);
return Shift.values()[ordinal];
}

}

关于Java:表示大量数据数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12424218/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com