БитМатрикс
БитМатрикс основан на ArrayBuffer, представляет собой класс матрицы с битом в качестве единицы.
Характеристики:
Сценарии использования: Любые сценарии, где требуется хранить точечные матричные данные.
Описание классов: Помимо BitMatrix, который использует ArrayBuffer для хранения данных, предоставляются два дополнительных класса: AnyMatrix и AnyMatrixUseObject. Эти классы могут использоваться как справочные или как матрицы, способные хранить любые значения. API у всех классов одинаковый.
Класс | Базовый тип данных | Диапазон значений |
---|---|---|
BitMatrix | Бит | 0/1 |
Int8Matrix | Int8Array | Int8 |
Uint8Matrix | Uint8Array | Uint8 |
Uint8ClampedMatrix | Uint8ClampedArray | Uint8 |
Int16Matrix | Int16Array | Int16 |
Uint16Matrix | Uint16Array | Uint16 |
Int32Matrix | Int32Array | Int32 |
Uint32Matrix | Uint32Array | Uint32 |
Float32Matrix | Float32Array | Float32 |
Float64Matrix | Float64Array | Float64 |
AnyMatrix | Массив | Любой |
AnyMatrixUseObject | Объект | Любой |
npm i bitmatrix
Node.js
const BitMatrix = require('bitmatrix').BitMatrix;
// Использование других классов матриц
// const {BitMatrix, Uint8Matrix, AnyMatrix} = require('bitmatrix');
let bm = new BitMatrix(2, 2, 0); // Инициализация 2x2 матрицы, заполненной нулями
console.log(bm.showView());
ES2015
// По умолчанию экспортируется класс BitMatrix
import BitMatrix from 'bitmatrix';
// Использование других классов матриц
// import {BitMatrix, Uint8Matrix, AnyMatrix} from 'bitmatrix'
console.log(bm.showView());
Для использования в браузере можно выбрать уже упакованные зависимости файла ./dist/BitMatrix.umd.js.
<script src="//unpkg.com/@cnwhy/base64/dist/BitMatrix.umd.js"></script>
API может быть ещё доработан, приветствуются предложения.
class Matrix {
constructor(width: number, height: number, defaultValue?: any);
// Ширина (только для чтения)
width: number;
// Высота (только для чтения)
height: number;
// Общее количество ячеек (только для чтения)
total: number;
// Заполнение матрицы
fill(value: any);
// Заполнение одной строки
fillRow(row: number, value: any);
// Заполнение одного столбца
fillColumn(column: number, value: any);
// Чтение указанной ячейки
get(x: number, y: number): any;
// Установка значения указанной ячейки
set(x: number, y: number, value: any);
// Чтение одной строки, возврат массива
getRow(y: number): any[];
// Установка одной строки
setRow(y: number, row:any[]);
// Чтение одного столбца, возврат массива
getColumn(x: number): any[];
// Установка одного столбца
setColumn(x: number, column: any[]);
// Раскрытие прототипа данных матрицы, если вы не уверены, что это такое, не используйте
getPrototypeData():Object;
// Перебор ячеек матрицы
cellForEach(fn: (value: any, x: number, y: number) => void);
// Разделение строк на '\n', столбцов на ',', возврат текущих данных матрицы
showView(): string;
// Создание копии матрицы
clone(): Matrix;
// Создание матрицы из существующего массива
static from(arr:[][]): Matrix;
static from(arr:[],width:number): Matrix;
// Создание матрицы указанного типа из существующей матрицы
static from(matrix:Matrix,callback:(value: any, x: number, y: number)=>any,thisArg): Matrix;
// Экспорт матрицы через base64
static output(matrix:Matrix): string;
// Импорт матрицы через base64
static input(base64:string): Matrix;
}
Рекомендуется использовать метод clone() для создания копий матрицы.
Для обеспечения максимальной совместимости рекомендуется использовать base64 в качестве посредника при импорте (input()) и экспорте (output()).
Структура данных для импорта/экспорта: Первые 9 байт представляют собой описательные байты, а остальные — данные.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ||||||||||||
Uint32LE(ширина) | Uint32LE(высота) | Uint8(тип метки) | ...(данные) |
import BitMatrix from 'bitmatrix';
let bm = new BitMatrix(7,7,0);
bm.fillColumn(3,1);
bm.fillRow(3,1);
let b64 = BitMatrix.output(bm);
console.log(b64);
let bm1 = BitMatrix.input(b64);
console.log(bm1.showView())
/*
AAAABwAAAAcDCATij0AgAA==
0,0,0,1,0,0,0
0,0,0,1,0,0,0
0,0,0,1,0,0,0
1,1,1,1,1,1,1
0,0,0,1,0,0,0
0,0,0,1,0,0,0
0,0,0,1,0,0,0
*/
На основе BufferArray работает только в средах, поддерживающих ES2015.
node v10.13.0
Из таблицы видно, что результаты соответствуют ожиданиям. Перевод текста на русский язык:
0 | BitMatrix | 0,77 МБ | 2,38 МБ | 3,16 МБ | 1,91 % | 7 | 1,46 % |
---|---|---|---|---|---|---|---|
1 | Int8Matrix | 0,87 МБ | 19,07 МБ | 19,94 МБ | 12,07 % | 16 | 3,33 % |
2 | Uint8Matrix | 0,82 МБ | 19,07 МБ | 19,90 МБ | 12,04 % | 14 | 2,92 % |
3 | Uint8ClampedMatrix | 0,82 МБ | 19,07 МБ | 19,89 МБ | 12,04 % | 15 | 3,13 % |
4 | Int16Matrix | 0,80 МБ | 38,15 МБ | 38,95 МБ | 23,57 % | 17 | 3,54 % |
5 | Uint16Matrix | 0,68 МБ | 38,15 МБ | 38,83 МБ | 23,50 % | 19 | 3,96 % |
6 | Int32Matrix | 0,53 МБ | 76,29 МБ | 76,82 МБ | 46,49 % | 147 | 30,63 % |
7 | Uint32Matrix | 0,53 МБ | 76,29 МБ | 76,82 МБ | 46,49 % | 139 | 28,96 % |
8 | Float32Matrix | 0,53 МБ | 76,29 МБ | 76,82 МБ | 46,49 % | 140 | 29,17 % |
9 | Float64Matrix | 0,49 МБ | 152,59 МБ | 153,08 МБ | 92,64 % | 286 | 59,58 % |
10 | AnyMatrix | 153,61 МБ | 0 МБ | 153,61 МБ | 92,96 % | 2445 | 509,38 % |
11 | AnyMatrixUseObject | 153,75 МБ | 0 МБ | 153,75 МБ | 93,05 % | 6056 | 1261,67 % |
12 | number[] | 153,13 МБ | 0 МБ | 153,13 МБ | 92,67 % | 2808 | 585,00 % |
13 | number[][] | 165,24 МБ | 0 МБ | 165,24 МБ | 100,00 % | 480 | 100,00 % |
Можно выполнить команду npm run test-memory для тестирования и получить этот результат.
(index) | name | fill | get | set | cellForEach |
---|---|---|---|---|---|
0 | BitMatrix | 210,31 КБ | 8194,21 КБ | 6275,51 КБ | 700,17 |
1 | Uint8Matrix | 25,63 КБ | 10969,26 КБ | 9658,56 КБ | 991,44 |
2 | Uint32Matrix | 2,66 КБ | 11844,04 КБ | 10304,60 КБ | 992,45 |
3 | Float64Matrix | 1,19 КБ | 11845,38 КБ | 10639,79 КБ | 988,99 |
4 | AnyMatrix | 1,23 КБ | 11453,06 КБ | 10560,18 КБ | 987,83 |
5 | number[] | 1,15 КБ | 15009,22 КБ | 14345,48 КБ | 960,72 |
6 | number[][] | 752,19 | 12196,47 КБ | 11029,79 КБ | 1,48 КБ |
В тестах get и set использовалось 9 точек, поэтому реальные значения следует умножить на 9.
Можно выполнить команду npm run test-benchmark, чтобы получить этот результат.
Примечание: в тексте запроса не было обнаружено кода на каком-либо языке программирования, гиперссылок, специальных тегов форматирования в markdown, html, yaml, json, plantuml и других элементов.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )