не удалось выполнить задачу ': app: compileDebugNdk' не удалось выполнить эту команду ndk-build.cmd

Если у вас 8,5 ГБ памяти (больше для unsigned ints, меньше, если суммы или индексы не охватывают весь диапазон int), создайте три массива. Сначала используется 1 бит на каждую возможную сумму. Это растровое изображение результатов. Второй использует 32 бита на каждую возможную сумму. Он записывает индекс j. Третья использует 1 бит на каждую возможную сумму. Это битовое поле, которое записывает, была ли эта сумма встречена в текущей итерации i - нуль с каждой итерацией. Итерация i = 0 ... n и j = i + 1 ... n. Для каждой суммы см., Если она установлена ​​в первом битовом поле (если оно было встречено раньше). Если это так, посмотрите, соответствует ли индекс, записанный во 2-м массиве, либо i, либо j (если старый j соответствует либо новому i, либо новому j). Если это не так, убедитесь, что бит в 2-м массиве установлен (если он был установлен в текущей итерации, поэтому старый i соответствует новому i). Если это не так, у вас есть матч! (Старый я никогда не буду сопоставлять старый j или новый j, а новый i никогда не будет соответствовать новому j.) Выход. В противном случае запишите сумму во всех трех массивах и продолжайте.

Хотя она использует память на 40 долларов (я люблю настоящее :), это, вероятно, намного быстрее, чем использование хеш-карт и бокса. Может даже использовать меньше памяти для больших n. Один недостаток данных почти никогда не будет в кэше L2. Но постарайтесь установить JVM для использования огромных страниц, так что по крайней мере промах TLB тоже не пойдет в основную память. Это o (n ^ 2) для обработки и o (1) для памяти.

13
задан user3188402 12 December 2014 в 22:26
поделиться