好吧,这是内幕:我正在用 Java 编写一个类,它可以找到第 N 个Hardy 的出租车号码(一个可以由两组不同的两个立方数相加的数字)。我有发现本身,但我迫切需要节省一些空间。为此,我需要尽可能小的数据结构,以便我可以相对轻松地使用或创建像 contains() 这样的方法。我并不特别担心速度,因为我目前的解决方案当然可以让它在时间限制内很好地计算。
简而言之,数据结构需要:
- 为了能够相对简单地实现一个 contains() 方法
- 使用少量内存
- 能够存储大量条目
- 易于与原始长类型一起使用
有任何想法吗?我从哈希图开始(因为我需要测试导致总和的值以确保准确性),然后在我保证可靠答案后转移到哈希集。
任何其他关于如何节省空间的一般想法将不胜感激!
我认为您不需要代码来回答问题,但如果您好奇的话,这里是:
public class Hardy {
// private static HashMap<Long, Long> hm;
/**
* Find the nth Hardy number (start counting with 1, not 0) and the numbers
* whose cubes demonstrate that it is a Hardy number.
* @param n
* @return the nth Hardy number
*/
public static long nthHardyNumber(int n) {
// long i, j, oldValue;
int i, j;
int counter = 0;
long xyLimit = 2147483647; // xyLimit is the max value of a 32bit signed number
long sum;
// hm = new HashMap<Long, Long>();
int hardyCalculations = (int) (n * 1.1);
HashSet<Long> hs = new HashSet<Long>(hardyCalculations * hardyCalculations, (float) 0.95);
long[] sums = new long[hardyCalculations];
// long binaryStorage, mask = 0x00000000FFFFFFFF;
for (i = 1; i < xyLimit; i++){
for (j = 1; j <= i; j++){
// binaryStorage = ((i << 32) + j);
// long y = ((binaryStorage << 32) >> 32) & mask;
// long x = (binaryStorage >> 32) & mask;
sum = cube(i) + cube(j);
if (hs.contains(sum) && !arrayContains(sums, sum)){
// oldValue = hm.get(sum);
// long oldY = ((oldValue << 32) >> 32) & mask;
// long oldX = (oldValue >> 32) & mask;
// if (oldX != x && oldX != y){
sums[counter] = sum;
counter++;
if (counter == hardyCalculations){
// Arrays.sort(sums);
bubbleSort(sums);
return sums[n - 1];
}
} else {
hs.add(sum);
}
}
}
return 0;
}
private static void bubbleSort(long[] array){
long current, next;
int i;
boolean ordered = false;
while (!ordered) {
ordered = true;
for (i = 0; i < array.length - 1; i++){
current = array[i];
next = array[i + 1];
if (current > next) {
ordered = false;
array[i] = next;
array[i+1] = current;
}
}
}
}
private static boolean arrayContains(long[] array, long n){
for (long l : array){
if (l == n){
return true;
}
}
return false;
}
private static long cube(long n){
return n*n*n;
}
}