Что такое большое число битов? Я не уверен, как работает этот метод, но я предполагаю, что он выполняется за O(logn).
В частности, с этим кодом (где x = 4, y = 1):
return Integer.bitCount(x^y);
Что такое большое число битов? Я не уверен, как работает этот метод, но я предполагаю, что он выполняется за O(logn).
В частности, с этим кодом (где x = 4, y = 1):
return Integer.bitCount(x^y);
Учитывая его реализацию, метод состоит из шести операторов O(1), выполняемых последовательно, так что это O(1).
public static int bitCount(int i) {
// HD, Figure 5-2
i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
i = (i + (i >>> 4)) & 0x0f0f0f0f;
i = i + (i >>> 8);
i = i + (i >>> 16);
return i & 0x3f;
}
popcnt
на платформах, которые его поддерживают (большинство интересных). Однако на самом деле это не меняет вывод (хотя это означает, что Integer.bitCount()
и Long.bitCount()
обычно занимают одно и то же время, что не было бы вашим выводом, если бы вы посмотрели на источник.
- person BeeOnRope; 30.05.2017
Это O(1)
, вот его реализация для JDK 1.5+:
public static int bitCount(int i) {
i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
i = (i + (i >>> 4)) & 0x0f0f0f0f;
i = i + (i >>> 8);
i = i + (i >>> 16);
return i & 0x3f;
}
Integer.bitCount
и несколько других простых методов в классах Integer
, Long
и т. д. реализованы как встроенные функции JVM, которые обычно приводят к созданию одной инструкции типа popcnt
. Тем не менее O (1), хотя :)
- person BeeOnRope; 30.05.2017
do_intrinsic(_bitCount_i, java_lang_Integer, bitCount_name, int_int_signature, F_S)
, которая указывает, что функция потенциально является встроенной.
- person BeeOnRope; 30.05.2017
.cpp
, чтобы увидеть, действительно ли он находится на интересующей вас платформе (обычно это так, как только вы найдете его в .hpp
, но это может быть не так по нескольким причинам). например, отсутствие поддержки на той или иной платформе и т. д.). В случае с bitCount
он обычно становится неотъемлемой частью интересующих современных платформ. Другой подход состоит в том, чтобы просто выполнить рассматриваемый метод в горячем цикле, а затем использовать что-то вроде perf top
для проверки выполняемых инструкций. См. также этот вопрос.
- person BeeOnRope; 30.05.2017
Integer.bitCount()
я получаю ~ 2,0 миллиарда вызовов на bitCount
в секунду, в то время как для точной копии кода JDK я получаю только 0,4 миллиарда вызовов в секунду.
- person BeeOnRope; 30.05.2017
memcpy
и часто заменяют его.
- person BeeOnRope; 30.05.2017
native
методы очень разные. Это является частью спецификации JVM (вероятно, ключевое слово native
также кратко упоминается в JLS) для реализации методов JNI. По сути, у вас есть C-подобная функция в каком-то двоичном файле, и эта функция вызывается, выполняет свою работу и возвращает результат. Существуют правила передачи параметров и многое другое. Он должен работать на любой платформе и т. д., хотя, конечно, вам нужно включать разные библиотеки для разных архитектур.
- person BeeOnRope; 30.05.2017
popcnt
, используйте ее, когда вы компилируете код, который использует Integer.bitCount
. Накладные расходы фактически нулевые, в то время как вызовы native
обычно имеют накладные расходы в 20 или более циклов. @shmosel
- person BeeOnRope; 30.05.2017
popcnt
нет, но, сообщая JIT о специальных методах в классе Integer
, он почти такой же, как и был. Некоторые методы в значительной степени должны быть реализованы как встроенные, например, методы в классах Atomic*
: эти методы имеют ключевое слово native
, но на самом деле они являются внутренними элементами...
- person BeeOnRope; 30.05.2017
Любой алгоритм, работающий с входными данными ограниченного размера, имеет сложность O(1)
.
bitCount
работает с вводом ограниченного размера.
Поэтому bitCount
имеют сложность O(1)
.
n
в вашемO(log n)
? Общее количество битов в целом числе? Говоря о Большом О, мы устанавливаем стоимость некоторой произвольной операции равной 1, и справедливо предположить, чтоbitCount
имеет стоимость 1. - person Mephy   schedule 30.05.2017O(1)
, см., например. stackoverflow.com/questions/1458314 / - person jonrsharpe   schedule 30.05.2017