СУБД, индексы?
Почитайте как хранятся в ней данные.
Ну, база данных это, конечно, круто и быстро, но мне хочется как-то попроще, в пределах одного экрана Си-кода :). На самом деле мне нужна идея, как это в принципе можно сделать.
Дык никто и не говорит повторить БД.
Хранить в памяти сами объекты и рядом индекс, по сути порядковый номер по увеличению значения 32х битного значения.
И вся задача по сути сводится к поиску значения в упорядоченном списке.
ЗЫ. Изучаются все эти методы в технических вузах. Или в интернете все есть.
Прежде всего следует определить понятие “сложности”.
Например, простой перебор записывается в одну строчку, но имеет вычислительную сложность O(N).
Вот что имеется в виду под “сложностью”, длина записи алгоритма или время его работы?
Ты троллишь? Это называется поиск индекса в массиве или поиск по ключу и так далее. Упорядочишь сперва за O(N*logN) шагов и ищи потом за O(logN) или сразу ищи за O(N).
Я думаю, что он “сложность” определяет в количестве “страничек” кода на С
Если у тебя всего лишь 2000 значений, их можно отсортировать, присвоить индекс и посчитать кол-во вхождений каждого числа. Индекс влезет в 2 байта, то есть каждому 32х разрядному числу поставить в соответствие 16 разрядное. При условии наличия на принимающей стороне точно такого же массива, можно передавать только индексы, сыканомив трафик в 2 раза. А если индексы передавать не 16 бит, а 11 (2000 в этот диапанос укладывается), то передавать придётся еще меньше
а если я 12 символов(12 байт) из utf 8 запишу 3 байтами в ASCII это будет считаться что я уменьшил число ?))) или это уже есть, и это обычные операции ? кажется научился 12 сокращать до 3, но это не точно)))
const int numRows = 8; // Количество строк
const int rowLength = 8; // Длина каждой строки
char receivedData[64]; // Массив для хранения принятых данных 64 максимум
char lines[numRows][rowLength + 1]; // Массив строк (плюс 1 для нуль-терминатора)
void setup() {
Serial.begin(9600); // Инициализация последовательного порта
Serial.println("Введите 64 символа:");
}
void loop() {
if (Serial.available() >= 63) { // Проверяем, что доступно 64 символа
Serial.readBytes(receivedData, 64); // Читаем 64 символа из последовательного порта
for (int i = 0; i < numRows; i++) {// Разбиваем на строки по 8 символов
// Копируем 8 символов в строку и добавляем нуль-терминатор
memcpy(lines[i], &receivedData[i * rowLength], rowLength);
lines[i][rowLength] = '\0'; }// Добавляем нуль-терминатор
for (int i = 0; i < numRows; i++) {Serial.println(lines[i]); }// Выводим все строки
}
}
если можно попутно подскажите пж что поправить тут ?
дело в том что работает только так if (Serial.available() >= 63) а если будет 64 то не сработает, а если 63 то сработает, но при вводе второй раз 8 символ пропадает…
профессор, разбирать твой код это отдельно оплачиваемая работа должна быть, с аккордно-авансовой системой оплаты.
если вы мне то я … студент, я знаю только то что нечего не знаю, к тому же комментарии оставил))) вникать не надо, если что то таам элементарное упускаю то подскажите пж…
я не понимаю ничего из того что ты пишешь, я тупой.
#include <Arduino.h>
const int SIZE = 2000; // Размер массива
uint32_t numbers[SIZE]; // Массив уникальных 32-битовых чисел
int indexMap[SIZE]; // Массив для хранения индексов
void setup() {
Serial.begin(9600);
// Заполнение массива уникальными числами
for (int i = 0; i < SIZE; i++) { numbers[i] = i * 1000; indexMap[i] = i; }// Сохраняем индексы
// Пример использования функции f()
uint32_t valueToFind = 1000; // Число, индекс которого мы хотим найти
int index = f(valueToFind);
if (index != -1) {
Serial.print("Индекс числа "); Serial.print(valueToFind);
Serial.print(" равен: "); Serial.println(index);
} else { Serial.print("Число "); Serial.print(valueToFind); Serial.println(" не найдено.");}
}
void loop() { }
// Функция для поиска индекса числа в массиве
int f(uint32_t value) {
for (int i = 0; i < SIZE; i++) {
if (numbers[i] == value) {
return indexMap[i];} // Возвращаем индекс
} return -1; } // Если число не найдено, возвращаем -1
Глобальные переменные используют 12260 байт (598%) динамической памяти, оставляя -10212 байт для локальных переменных. Максимум: 2048 байт.
пойдет или не то ?)))
Cтудент, CTRL+T освой хотя бы для начала.
вот это я понял, ништяк у тебя ресурсов хватает.
Ты это понял только потому, что писал это не BABOS, а компилятор.
Время работы, конечно.
Ну у тебя просто поиск. Это и так понятно.
Функция нужна. А у тебя - процедура.
Это в Паскале они различаются, а в С/С++ это одно и то же.
Возвернем, однако, тему топика в нужном направлении.
Библиотека для ESP32, для сжатия данных:
(тут должен быть прикреплен файл, но админы arduino.ru считают, что это ни к чему, а вот прикрепить .jpg на их взгляд - полезнее)
Ну, тогда пусть будет jpg.
@sav13, ищи файл miniz.c версии, как на скриншоте.
Пример использования (у меня у одного синтаксис не подсвечивается? Или это вообще фишка всей экосистемы ардуино? что ИДЕ, что Форум - глюк на глюке и багами погоняет.):
// example1.c - Demonstrates miniz.c's compress() and uncompress() functions (same as zlib's).
// Public domain, May 15 2011, Rich Geldreich, richgel99@gmail.com. See "unlicense" statement at the end of tinfl.c.
#include "miniz.c"
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned int uint;
// The string to compress.
static const char *s_pStr = "Good morning Dr. Chandra. This is Hal. I am ready for my first lesson." \
"Good morning Dr. Chandra. This is Hal. I am ready for my first lesson." \
"Good morning Dr. Chandra. This is Hal. I am ready for my first lesson." \
"Good morning Dr. Chandra. This is Hal. I am ready for my first lesson." \
"Good morning Dr. Chandra. This is Hal. I am ready for my first lesson." \
"Good morning Dr. Chandra. This is Hal. I am ready for my first lesson." \
"Good morning Dr. Chandra. This is Hal. I am ready for my first lesson.";
int main(int argc, char *argv[])
{
uint step = 0;
int cmp_status;
uLong src_len = (uLong)strlen(s_pStr);
uLong cmp_len = compressBound(src_len);
uLong uncomp_len = src_len;
uint8 *pCmp, *pUncomp;
uint total_succeeded = 0;
(void)argc, (void)argv;
printf("miniz.c version: %s\n", MZ_VERSION);
do
{
// Allocate buffers to hold compressed and uncompressed data.
pCmp = (mz_uint8 *)malloc((size_t)cmp_len);
pUncomp = (mz_uint8 *)malloc((size_t)src_len);
if ((!pCmp) || (!pUncomp))
{
printf("Out of memory!\n");
return EXIT_FAILURE;
}
// Compress the string.
cmp_status = compress(pCmp, &cmp_len, (const unsigned char *)s_pStr, src_len);
if (cmp_status != Z_OK)
{
printf("compress() failed!\n");
free(pCmp);
free(pUncomp);
return EXIT_FAILURE;
}
printf("Compressed from %u to %u bytes\n", (mz_uint32)src_len, (mz_uint32)cmp_len);
if (step)
{
// Purposely corrupt the compressed data if fuzzy testing (this is a very crude fuzzy test).
uint n = 1 + (rand() % 3);
while (n--)
{
uint i = rand() % cmp_len;
pCmp[i] ^= (rand() & 0xFF);
}
}
// Decompress.
cmp_status = uncompress(pUncomp, &uncomp_len, pCmp, cmp_len);
total_succeeded += (cmp_status == Z_OK);
if (step)
{
printf("Simple fuzzy test: step %u total_succeeded: %u\n", step, total_succeeded);
}
else
{
if (cmp_status != Z_OK)
{
printf("uncompress failed!\n");
free(pCmp);
free(pUncomp);
return EXIT_FAILURE;
}
printf("Decompressed from %u to %u bytes\n", (mz_uint32)cmp_len, (mz_uint32)uncomp_len);
// Ensure uncompress() returned the expected data.
if ((uncomp_len != src_len) || (memcmp(pUncomp, s_pStr, (size_t)src_len)))
{
printf("Decompression failed!\n");
free(pCmp);
free(pUncomp);
return EXIT_FAILURE;
}
}
free(pCmp);
free(pUncomp);
step++;
// Keep on fuzzy testing if there's a non-empty command line.
} while (argc >= 2);
printf("Success.\n");
return EXIT_SUCCESS;
}
Автор темы @sav13 , а не “бабосик”.