В настоящее время я думаю о том, как хранить часто используемые данные. Он предназначен для хранения в массиве и в настоящее время создается следующим образом.Есть ли способ вычисления индексов, генерируемых вложенными циклами?
public static void generateData() {
int index = 0;
for(int a1 = 0; a1 < 52; a1++) {
for(int a2 = a1 + 1; a2 < 52; a2++) {
for(int a3 = a2 + 1; a3 < 52; a3++) {
for(int a4 = a3 + 1; a4 < 52; a4++) {
for(int a5 = a4 + 1; a5 < 52; a5++) {
for(int a6 = a5 + 1; a6 < 52; a6++) {
for(int a7 = a6 + 1; a7 < 52; a7++) {
data[index++] = compute(a1,a2,a3,a4,a5,a6,a7);
}
}
}
}
}
}
}
}
Моя проблема заключается в том, чтобы быстро получить доступ к вычисленным данным с использованием параметров a1-a7. Единственный подход, который я мог думать о том, чтобы перебирать подобно тому, как во время итерации, пока параметры не являются такими же, как этот
public static int getIndex(int i1, int i2, int i3, int i4, int i5, int i6, int i7) {
int index = 0;
for(int a1 = 0; a1 < 52; a1++) {
for(int a2 = a1 + 1; a2 < 52; a2++) {
for(int a3 = a2 + 1; a3 < 52; a3++) {
for(int a4 = a3 + 1; a4 < 52; a4++) {
for(int a5 = a4 + 1; a5 < 52; a5++) {
for(int a6 = a5 + 1; a6 < 52; a6++) {
for(int a7 = a6 + 1; a7 < 52; a7++) {
if(a1 == i1 && a2 == i2 && a3 == i3 && a4 == i4 && a5 == i5 && a6 == i6 && a7 == i7) {
return index;
} else {
index++;
}
}
}
}
}
}
}
}
throw new IllegalArgumentException();
}
Однако этот подход работает только в линейном времени, который не достаточно быстро, учитывая количество данные. Из-за этого мне было интересно, есть ли способ вычислить индекс в постоянном или логарифмическом времени. Как мой вопрос может показаться довольно расплывчатым. Я сохраняю все возможные результаты каждой возможной руки Texas hold'em
, чтобы провести некоторое дополнительное тестирование.
Это скорее математический вопрос, чем вопрос программирования –
Поскольку данные сортируются, поэтому вы можете использовать двоичный поиск для каждого значения a1, a2, ..., a7, а затем вычислить индекс. ex: index = основанный индекс a1 * основанный индекс a2 * основанный индекс a3 ... – Minh