Комикс: Что такое алгоритм Bitmap?

алгоритм









Два месяца назад-













Чтобы соответствовать статистическим требованиям пользовательских меток, Xiaohui использует Mysql для разработки следующей структуры таблицы, а метка каждого измерения соответствует столбцу таблицы Mysql:



Как посчитать всех программистов 90-х годов рождения?


Вы можете использовать оператор SQL, чтобы найти пересечение:


Выберите количество (отличное имя) как количество пользователей из таблицы, где возраст = «после 90» и профессия = «программист»;



Что мне делать, чтобы подсчитать общее количество пользователей, которые используют iPhone или после 00?


Просто используйте оператор SQL для набора союзов:


Выберите количество (различное имя) как количество пользователей из таблицы whare Phone = «Apple» или age = «после 00»;





Через два месяца-












———————————————













1. Для битового массива длиной 10 каждый бит соответствует 10 целым числам от 0 до 9. В это время все биты растрового изображения равны 0.


2. Сохраните целое число 4 в растровом изображении, соответствующее место хранения — это место с индексом 4, и этот бит установлен в 1.



3. Сохраните целое число 2 в растровом изображении, соответствующее место хранения — это место с индексом 2, и установите этот бит в 1.



4. Сохраните целое число 1 в растровом изображении, соответствующее место хранения — это место с нижним индексом 1, и этот бит установлен в 1.



5. Сохраните целое число 3 в растровом изображении, соответствующее место хранения — это место с нижним индексом 3, и этот бит установлен в 1.




Какие элементы хранятся в растровом изображении в это время? Очевидно 4,3,2,1 с первого взгляда.


Bitmap не только удобен для запросов, но также может удалять повторяющиеся целые числа.















1. Создайте сопоставление между именами пользователей и идентификаторами пользователей:




2. Пусть каждый тег хранит все идентификаторы пользователей, содержащие этот тег, и каждый тег является независимым Bitmap.




3. Таким образом, дедупликация пользователя и статистика запросов становятся понятными с первого взгляда:












1. Как найти программистов, которые используют iPhone?




2. Как найти всех пользователей мужского пола или пост-00?




















спустя неделю......











Возьмем в качестве примера пользовательские данные предыдущего выпуска.Основная информация о пользователе следующая. По возрастному тегу его можно разделить на два битмапа после 90-х и 00-х:





В более наглядном представлении Bitmap пользователей после 90-х выглядит следующим образом:




В настоящее время его можно получить напрямуюНетПользователи после 90-х? Прямая операция НЕ?




Очевидно, что на самом деле существует только 1 пользователь не после 90-х годов, а не 8 результатов, полученных на рисунке, поэтому операция НЕ не может быть выполнена напрямую.







Только что в том же примере мы даем Bitmap пользователей после 90-х, а затем даем Bitmap всех пользователей. Последнее требование — это та часть, которая существует у полного числа пользователей, но отсутствует у пользователей после 90-х годов.





Как попросить об этом? мы можем использоватьисключающее ИЛИоперации, то есть одни и те же биты равны 0, а разные биты равны 1.







































































25769803776L = 11000000000000000000000000000000000B

8589947086L = 1000000000000000000011000011001110B















1. Проанализируйте Word0 и убедитесь, что количество пустых слов, охваченных текущим RLW, равно 0, за которыми следуют 3 последовательных обычных слова.


2. Рассчитайте максимальный идентификатор последовательных обычных слов после текущего RLW: 64 X (0 + 3) -1 = 191.


3. Поскольку 191


4. Разобрать слово 4 и узнать, что количество пустых слов, охваченных текущим RLW, равно 6247, за которыми следует одно последовательное обычное слово.


5. Рассчитайте максимальный идентификатор последовательных обычных слов за текущим RLW (Word4): 191 + (6247 + 1) X64 = 400063.


6. Поскольку 400003


Окончательный результат вставки выглядит следующим образом:













Официальное описание выглядит следующим образом:


* Though you can set the bits in any order (e.g., set(100), set(10), set(1),
* you will typically get better performance if you set the bits in increasing order (e.g., set(1), set(10), set(100)).
* 
* Setting a bit that is larger than any of the current set bit
* is a constant time operation. Setting a bit that is smaller than an 
* already set bit can require time proportional to the compressed
* size of the bitmap, as the bitmap may need to be rewritten.




Несколько заметок:


1. Первоначальный технический выбор этого проекта - не Mysql, а in-memory БД хана. Для простоты понимания в этой статье исходная схема хранения описана как база данных Mysq.


1. Представленный в этой статье метод оптимизации Bitmap в определенной степени упрощен, а логика в исходном коде намного сложнее. Например, расположение вставленных данных 400003 отличается от фактических шагов.


2. Если студенты заинтересованы, они могут прочитать исходный код лично или даже попытаться реализовать свой собственный алгоритм Bitmap. Хотя это занимает много времени, это отличный способ научиться.

EWAHCompressedBitmap对应的maven依赖如下:

<dependency>
  <groupId>com.googlecode.javaewah</groupId>
  <artifactId>JavaEWAH</artifactId>
  <version>1.1.0</version>
</dependency>



----КОНЕЦ----



Друзья, которым понравилась эта статья, можете долго нажимать на картинку, чтобы следить за номером подписки.программист маленький серый, смотрите больше захватывающего контента