当前位置: 首页 > news >正文

青少年编程与数学 02-018 C++数据结构与算法 26课题、数据压缩算法

青少年编程与数学 02-018 C++数据结构与算法 26课题、数据压缩算法

  • 一、无损压缩算法
    • 1. Huffman编码
    • 2. Lempel-Ziv-Welch (LZW) 编码
    • 3. Run-Length Encoding (RLE)
  • 二、有损压缩算法
    • 1. DEFLATE(ZIP压缩)
    • 2. Brotli
    • 3. LZMA
    • 4. Zstandard (Zstd)
  • 总结

课题摘要:
介绍一些常见的数据压缩算法,并提供更详细的C++代码实现。


一、无损压缩算法

1. Huffman编码

Huffman编码是一种基于字符频率的编码方法,通过构建一棵Huffman树来生成每个字符的唯一编码。

详细代码示例(C++)

  1. 定义节点结构:
    struct Node {char ch;int freq;Node* left;Node* right;Node(char ch, int freq) : ch(ch), freq(freq), left(nullptr), right(nullptr) {}
    };
    
  2. 定义比较函数:
    struct Compare {bool operator()(Node* left, Node* right) {return left->freq > right->freq;}
    };
    
  3. 生成编码:
    void generateCodes(Node* root, std::string str, std::unordered_map<char, std::string>& huffmanCode) {if (!root)return;if (!root->left && !root->right) {huffmanCode[root->ch] = str;}generateCodes(root->left, str + "0", huffmanCode);generateCodes(root->right, str + "1", huffmanCode);
    }
    
  4. 编码函数:
    std::string huffmanEncode(const std::string& text) {std::unordered_map<char, int> freq;for (char ch : text) {freq[ch]++;}std::priority_queue<Node*, std::vector<Node*>, Compare> heap;for (auto pair : freq) {heap.push(new Node(pair.first, pair.second));}while (heap.size() > 1) {Node* left = heap.top();heap.pop();Node* right = heap.top();heap.pop();Node* combined = new Node('\0', left->freq + right->freq);combined->left = left;combined->right = right;heap.push(combined);}std::unordered_map<char, std::string> huffmanCode;generateCodes(heap.top(), "", huffmanCode);std::string encodedText;for (char ch : text) {encodedText += huffmanCode[ch];}return encodedText;
    }
    
  5. 解码函数:
    std::string huffmanDecode(const std::string& encodedText, Node* root) {std::string decodedText;Node* current = root;for (char bit : encodedText) {if (bit == '0') {current = current->left;} else {current = current->right;}if (!current->left && !current->right) {decodedText += current->ch;current = root;}}return decodedText;
    }
    
  6. 主函数:
    int main() {std::string text = "this is an example for huffman encoding";std::string encodedText = huffmanEncode(text);std::cout << "Encoded string: " << encodedText << std::endl;Node* root = nullptr; // Assume root is the root of the Huffman treestd::string decodedText = huffmanDecode(encodedText, root);std::cout << "Decoded string: " << decodedText << std::endl;return 0;
    }
    

2. Lempel-Ziv-Welch (LZW) 编码

LZW编码是一种基于字典的压缩算法,通过动态构建字典来编码重复的字符串。

详细代码示例(C++)

  1. 编码函数:
    std::vector<int> lzwEncode(const std::string& text) {std::unordered_map<std::string, int> dictionary;for (int i = 0; i < 256; ++i) {dictionary[std::string(1, i)] = i;}std::string w;std::vector<int> result;for (char c : text) {std::string wc = w + c;if (dictionary.find(wc) != dictionary.end()) {w = wc;} else {result.push_back(dictionary[w]);dictionary[wc] = dictionary.size();w = std::string(1, c);}}if (!w.empty()) {result.push_back(dictionary[w]);}return result;
    }
    
  2. 解码函数:
    std::string lzwDecode(const std::vector<int>& encoded) {std::unordered_map<int, std::string> dictionary;for (int i = 0; i < 256; ++i) {dictionary[i] = std::string(1, i);}std::string result;std::string w = dictionary[encoded[0]];result += w;for (size_t k = 1; k < encoded.size(); ++k) {std::string entry;if (dictionary.find(encoded[k]) != dictionary.end()) {entry = dictionary[encoded[k]];} else if (encoded[k] == dictionary.size()) {entry = w + w[0];}result += entry;dictionary[dictionary.size()] = w + entry[0];w = entry;}return result;
    }
    
  3. 主函数:
    int main() {std::string text = "TOBEORNOTTOBEORTOBEORNOT";std::vector<int> encoded = lzwEncode(text);std::cout << "Encoded: ";for (int code : encoded) {std::cout << code << " ";}std::cout << std::endl;std::string decoded = lzwDecode(encoded);std::cout << "Decoded: " << decoded << std::endl;return 0;
    }
    

3. Run-Length Encoding (RLE)

RLE是一种简单的无损压缩算法,通过将连续重复的字符替换为字符和重复次数的组合。

详细代码示例(C++)

  1. 编码函数:
    std::string rleEncode(const std::string& text) {if (text.empty()) {return "";}std::string result;char prevChar = text[0];int count = 1;for (size_t i = 1; i < text.size(); ++i) {if (text[i] == prevChar) {++count;} else {result += prevChar + std::to_string(count);prevChar = text[i];count = 1;}}result += prevChar + std::to_string(count);return result;
    }
    
  2. 解码函数:
    std::string rleDecode(const std::string& encoded) {std::string result;for (size_t i = 0; i < encoded.size(); i += 2) {char ch = encoded[i];int count = std::stoi(encoded.substr(i + 1, 1));result.append(count, ch);}return result;
    }
    
  3. 主函数:
    int main() {std::string text = "AAAABBBCCDAA";std::string encoded = rleEncode(text);std::cout << "Encoded: " << encoded << std::endl;std::string decoded = rleDecode(encoded);std::cout << "Decoded: " << decoded << std::endl;return 0;
    }
    

二、有损压缩算法

1. DEFLATE(ZIP压缩)

DEFLATE是一种结合了LZ77算法和Huffman编码的压缩算法,广泛用于ZIP文件格式。

详细代码示例(C++)

  1. 压缩函数:
    std::vector<unsigned char> deflateCompress(const std::string& data) {z_stream strm;strm.zalloc = Z_NULL;strm.zfree = Z_NULL;strm.opaque = Z_NULL;strm.avail_in = static_cast<uInt>(data.size());strm.next_in = reinterpret_cast<Bytef*>(const_cast<char*>(data.c_str()));deflateInit(&strm, Z_DEFAULT_COMPRESSION);std::vector<unsigned char> compressedData(data.size() + 100);strm.avail_out = static_cast<uInt>(compressedData.size());strm.next_out = compressedData.data();deflate(&strm, Z_FINISH);compressedData.resize(strm.total_out);deflateEnd(&strm);return compressedData;
    }
    
  2. 解压缩函数:
    std::string deflateDecompress(const std::vector<unsigned char>& compressedData) {z_stream strm;strm.zalloc = Z_NULL;strm.zfree = Z_NULL;strm.opaque = Z_NULL;strm.avail_in = static_cast<uInt>(compressedData.size());strm.next_in = compressedData.data();inflateInit(&strm);std::vector<unsigned char> decompressedData(compressedData.size() * 2);strm.avail_out = static_cast<uInt>(decompressedData.size());strm.next_out = decompressedData.data();inflate(&strm, Z_NO_FLUSH);decompressedData.resize(strm.total_out);inflateEnd(&strm);return std::string(decompressedData.begin(), decompressedData.end());
    }
    
  3. 主函数:
    int main() {std::string data = "this is an example for deflate compression";std::vector<unsigned char> compressedData = deflateCompress(data);std::cout << "Compressed data size: " << compressedData.size() << std::endl;std::string decompressedData = deflateDecompress(compressedData);std::cout << "Decompressed data: " << decompressedData << std::endl;return 0;
    }
    

2. Brotli

Brotli是一种现代的压缩算法,结合了多种压缩技术,提供比DEFLATE更好的压缩率。

详细代码示例(C++)

  1. 压缩函数:
    std::vector<uint8_t> brotliCompress(const std::string& data) {size_t outputSize = BrotliEncoderMaxCompressedSize(data.size());std::vector<uint8_t> compressedData(outputSize);BrotliEncoderParams params;BrotliEncoderSetParameter(&params, BROTLI_PARAM_QUALITY, 11);BrotliEncoderSetParameter(&params, BROTLI_PARAM_MODE, BROTLI_MODE_TEXT);BrotliEncoderSetParameter(&params, BROTLI_PARAM_LGWIN, 22);size_t encodedSize = 0;BrotliEncoderCompress(data.size(), data.data(), &encodedSize, compressedData.data(), &params);compressedData.resize(encodedSize);return compressedData;
    }
    
  2. 解压缩函数:
    std::string brotliDecompress(const std::vector<uint8_t>& compressedData) {size_t outputSize = BrotliDecoderDecompressedSize(compressedData.size(), compressedData.data());std::vector<uint8_t> decompressedData(outputSize);BrotliDecoderResult result = BrotliDecoderDecompress(compressedData.size(), compressedData.data(), &outputSize, decompressedData.data());if (result != BROTLI_DECODER_RESULT_SUCCESS) {throw std::runtime_error("Brotli decompression failed");}return std::string(decompressedData.begin(), decompressedData.end());
    }
    
  3. 主函数:
    int main() {std::string data = "this is an example for brotli compression";std::vector<uint8_t> compressedData = brotliCompress(data);std::cout << "Compressed data size: " << compressedData.size() << std::endl;std::string decompressedData = brotliDecompress(compressedData);std::cout << "Decompressed data: " << decompressedData << std::endl;return 0;
    }
    

3. LZMA

LZMA是一种高效的压缩算法,广泛用于7z文件格式。

详细代码示例(C++)

  1. 压缩函数:
    std::vector<uint8_t> lzmaCompress(const std::string& data) {lzma_stream strm = LZMA_STREAM_INIT;lzma_ret ret = lzma_easy_encoder(&strm, LZMA_PRESET_DEFAULT, LZMA_CHECK_CRC64);if (ret != LZMA_OK) {throw std::runtime_error("LZMA encoder initialization failed");}strm.avail_in = data.size();strm.next_in = reinterpret_cast<uint8_t*>(const_cast<char*>(data.data()));std::vector<uint8_t> compressedData(data.size() + LZMA_HEADER_SIZE + LZMA_FOOTER_SIZE);strm.avail_out = compressedData.size();strm.next_out = compressedData.data();ret = lzma_code(&strm, LZMA_FINISH);if (ret != LZMA_STREAM_END) {throw std::runtime_error("LZMA compression failed");}compressedData.resize(strm.total_out);lzma_end(&strm);return compressedData;
    }
    
  2. 解压缩函数:
    std::string lzmaDecompress(const std::vector<uint8_t>& compressedData) {lzma_stream strm = LZMA_STREAM_INIT;lzma_ret ret = lzma_stream_decoder(&strm, UINT64_MAX, LZMA_CONCATENATED);if (ret != LZMA_OK) {throw std::runtime_error("LZMA decoder initialization failed");}strm.avail_in = compressedData.size();strm.next_in = compressedData.data();std::vector<uint8_t> decompressedData(compressedData.size() * 2);strm.avail_out = decompressedData.size();strm.next_out = decompressedData.data();ret = lzma_code(&strm, LZMA_FINISH);if (ret != LZMA_STREAM_END) {throw std::runtime_error("LZMA decompression failed");}decompressedData.resize(strm.total_out);lzma_end(&strm);return std::string(decompressedData.begin(), decompressedData.end());
    }
    
  3. 主函数:
    int main() {std::string data = "this is an example for lzma compression";std::vector<uint8_t> compressedData = lzmaCompress(data);std::cout << "Compressed data size: " << compressedData.size() << std::endl;std::string decompressedData = lzmaDecompress(compressedData);std::cout << "Decompressed data: " << decompressedData << std::endl;return 0;
    }
    

4. Zstandard (Zstd)

Zstd是一种现代的压缩算法,结合了高压缩率和快速解压缩的特点。

详细代码示例(C++)

  1. 压缩函数:
    std::vector<uint8_t> zstdCompress(const std::string& data) {size_t compressedSize = ZSTD_compressBound(data.size());std::vector<uint8_t> compressedData(compressedSize);size_t result = ZSTD_compress(compressedData.data(), compressedSize, data.data(), data.size(), ZSTD_defaultCLevel());if (ZSTD_isError(result)) {throw std::runtime_error("Zstd compression failed");}compressedData.resize(result);return compressedData;
    }
    
  2. 解压缩函数:
    std::string zstdDecompress(const std::vector<uint8_t>& compressedData) {size_t decompressedSize = ZSTD_getFrameContentSize(compressedData.data(), compressedData.size());if (decompressedSize == ZSTD_CONTENTSIZE_UNKNOWN || decompressedSize == ZSTD_CONTENTSIZE_ERROR) {throw std::runtime_error("Zstd decompression failed: unknown content size");}std::vector<uint8_t> decompressedData(decompressedSize);size_t result = ZSTD_decompress(decompressedData.data(), decompressedSize, compressedData.data(), compressedData.size());if (ZSTD_isError(result)) {throw std::runtime_error("Zstd decompression failed");}return std::string(decompressedData.begin(), decompressedData.end());
    }
    
  3. 主函数:
    int main() {std::string data = "this is an example for zstd compression";std::vector<uint8_t> compressedData = zstdCompress(data);std::cout << "Compressed data size: " << compressedData.size() << std::endl;std::string decompressedData = zstdDecompress(compressedData);std::cout << "Decompressed data: " << decompressedData << std::endl;return 0;
    }
    

总结

这些数据压缩算法在不同的场景下具有各自的优势和适用性。无损压缩算法如Huffman编码、LZW编码和RLE适用于需要完全恢复原始数据的场景,而有损压缩算法如JPEG压缩则适用于对数据质量要求不高的场景。根据具体需求选择合适的压缩算法可以有效节省存储空间和传输带宽。

相关文章:

青少年编程与数学 02-018 C++数据结构与算法 26课题、数据压缩算法

青少年编程与数学 02-018 C数据结构与算法 26课题、数据压缩算法 一、无损压缩算法1. Huffman编码2. Lempel-Ziv-Welch (LZW) 编码3. Run-Length Encoding (RLE) 二、有损压缩算法1. DEFLATE&#xff08;ZIP压缩&#xff09;2. Brotli3. LZMA4. Zstandard (Zstd) 总结 课题摘要…...

Sim Studio 是一个开源的代理工作流程构建器。Sim Studio 的界面是一种轻量级、直观的方式,可快速构建和部署LLMs与您最喜欢的工具连接

​一、软件介绍 文末提供程序和源码下载 Sim Studio开源程序 是一个功能强大、用户友好的平台&#xff0c;用于构建、测试和优化代理工作流程&#xff0c;Sim Studio 是一个开源的代理工作流程构建器。Sim Studio 的界面是一种轻量级、直观的方式&#xff0c;可快速构建和部署…...

基于Boost库、Jsoncpp、cppjieba、cpp-httplib等构建Boost搜索引擎

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;项目 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 项目背景技术栈和项目环境正排索引和倒排索引数据去标签与清洗下载数据源去标签 建立索引构建正排索引构建倒排索引 建立搜索引擎h…...

文本三剑客

目录 1.文本三剑客 2.awk 常见的内置变量 3.sed 选项&#xff1a; 脚本语法&#xff1a; 查找替换&#xff1a; 步进&#xff1a; 1.文本三剑客 awk&#xff1b;sed&#xff1b;grep 读取方式为&#xff1a;vim先将整个文件放入内存中进行编辑&#xff1b;awk是先将文…...

使用 Microsoft 365 Copilot 上传手机图片,实现更高效的信息提取

过去&#xff0c;如果你想从手机上的图片中提取信息或获取洞察&#xff0c;流程往往十分繁琐&#xff1a;需要先把图片发到邮箱&#xff0c;再下载到电脑&#xff0c;最后才能上传到 Copilot 聊天框中。 现在不必如此了&#xff01;在你熟悉的 Microsoft 365 Windows 应用或网…...

simulink使能子系统的四种配置

目录 前言 一、模型 二、特性 组合1&#xff1a;使能模块为保持&#xff0c;输出为保持 组合2&#xff1a;使能模块为保持&#xff0c;输出为重置 组合3&#xff1a;使能模块为重置&#xff0c;输出为保持 组合4&#xff1a;使能模块为重置&#xff0c;输出为重置 仓库…...

一、Hadoop历史发展与优劣势

引言&#xff1a;大数据浪潮中的“大象”——Hadoop 的足迹与权衡 当数据以前所未有的速度和规模涌现&#xff0c;大数据时代悄然来临&#xff0c;传统的数据处理方式显得力不从心。在这样的背景下&#xff0c;Hadoop 应运而生&#xff0c;如同一头强健而可靠的大象&#xff0…...

conda配置好的pytorch在jupyter中如何配置

配置 其实不用再配置了 如下图&#xff08;主要是激活pytorch环境&#xff0c;再jupyter notebook&#xff09; jupyter运行快捷键shiftenter 新建文件夹folder&#xff0c;新建notebook 使用 帮助文档&#xff08;两种方式&#xff09; ctrl/ 注释...

文本三剑客试题

目录 1找出/etc/passwd文件下的root开头的行 2找出/etc/passwd 含有root 的行 3找出/etc/passwd 文件中 root开头或 mail 开头的行 4过滤出 /etc/passwd文件中已bin开头的行&#xff0c;并显示行号 5过滤掉/etc/passwd文件中 root开头的行 6.在当前目录下所有.cc 的文件中…...

vscode docker 调试

目录 启动docker&#xff1a; vscode docker 调试 如果已经安装docker并且启动了。 启动docker&#xff1a; docker exec -it nlf /bin/bash vscode docker 调试 按照图中1 2 3 的顺序&#xff0c;进入&#xff0c;可以加载docker进行调试了。...

【程序人生】“阶段总结“-安危相易

好久没有坐下静下心回顾过去一段时间内发生的事以及经历过后的感想。今天趁着五一假期的机会细细盘一盘过去这段时间内的点点感悟吧...... 记得上一次的阶段总结停留在了24年的11月底。当初计划的是每月月底会抽出时间来进行一次深度的回顾与阶段总结&#xff0c;但是计划总赶…...

【Linux】深入理解Linux基础IO:从文件描述符到缓冲区设计

目录 一、文件理解&#xff08;复习&#xff09; 1、理解概念复习 &#xff08;1&#xff09;狭义理解 &#xff08;2&#xff09;广义理解 &#xff08;3&#xff09;文件操作的归类认知 &#xff08;4&#xff09;系统角度 2、C语言文件复习 &#xff08;1&#xff0…...

【纪念我的365天】我的创作纪念日

机缘 最开始接触csdn时我从没想过我会是博客的创作者&#xff0c;最初我认为它是一个为我解决问题的作业神器&#xff0c;开始接触编程时什么都不懂&#xff0c;为各种问题查阅资料&#xff0c;可偏偏就是无法越过这道坎。于是机遇巧合之下遇到一个人他教我&#xff0c;也是他…...

方法:批量识别图片区域文字并重命名,批量识别指定区域内容改名,基于QT和阿里云的实现方案,详细方法

基于QT和阿里云的图片区域文字识别与批量重命名方案 项目场景 ​​企业档案管理​​:批量处理扫描合同、发票等文档,根据编号或关键信息自动重命名文件​​医疗影像管理​​:识别X光、CT等医学影像中的患者信息,按姓名+检查日期重命名​​电商订单处理​​:从订单截图中提…...

民宿管理系统5

管理员管理&#xff1a; 新增管理员信息&#xff1a; 前端效果&#xff1a; 前端代码&#xff1a; <body> <div class"layui-fluid"><div class"layui-row"><div class"layui-form"><div class"layui-form-i…...

AI日报 · 2025年5月05日|雅诗兰黛与微软合作成立 AI 创新实验室,加速美妆产品研发与营销

1、苹果与 Anthropic 深化合作&#xff0c;内部测试 AI 驱动的新版 Xcode 据多方报道&#xff0c;苹果公司正与人工智能初创公司 Anthropic 合作&#xff0c;开发集成 AI 功能的新一代 Xcode 开发平台。该平台旨在利用 Anthropic 强大的 Claude Sonnet 模型&#xff0c;为开发…...

Matlab实现基于CNN-GRU的锂电池SOH估计

Matlab实现基于CNN-GRU的锂电池SOH估计 目录 Matlab实现基于CNN-GRU的锂电池SOH估计效果一览基本介绍程序设计参考资料 效果一览 基本介绍 锂电池SOH估计&#xff01;基于CNN-GRU的锂电池健康状态估计。CNN-GRU模型通过融合局部特征提取与长期依赖建模&#xff0c;显著提升了锂…...

神经网络在专家系统中的应用:从符号逻辑到连接主义的融合创新

自人工智能作为一个学科面世以来&#xff0c;关于它的研究途径就存在两种不同的观点。一种观点主张对人脑的结构及机理开展研究&#xff0c;并通过大规模集成简单信息处理单元来模拟人脑对信息的处理&#xff0c;神经网络是这一观点的代表。关于这方面的研究一般被称为连接机制…...

【Hive入门】Hive安全管理与权限控制:基于SQL标准的授权GRANT REVOKE深度解析

目录 引言 1 Hive权限模型概述 2 SQL标准授权基础 2.1 核心概念解析 2.2 授权模型工作流程 3 GRANT/REVOKE语法详解 3.1 基础授权语法 3.2 权限回收语法 3.3 参数说明 4 授权场景 4.1 基础授权示例 4.2 列级权限控制 4.3 视图权限管理 5 权限查询与验证 5.1 查看…...

详解RabbitMQ工作模式之发布订阅模式

目录 发布订阅模式 概念 概念介绍 特点和优势 应用场景 注意事项 代码案例 引入依赖 常量类 编写生产者代码 编写消费者1代码 运行代码 发布订阅模式 概念 RabbitMQ的发布订阅模式&#xff08;Publish/Subscribe&#xff09;是一种消息传递模式&#xff0c;它允许消…...

JobHistory Server的配置和启动

在 Hadoop 集群里&#xff0c;JobHistory Server&#xff08;JHS&#xff09;负责为所有已完成的 MapReduce 作业提供元数据与 Web 可视化&#xff1b;只有它启动并配置正确&#xff0c;开发者才能通过 http://<host>:19888 查看作业的执行详情、计数器和任务日志…...

刷leetcodehot100返航版--哈希表5/5

回顾一下之前做的哈希&#xff0c;貌似只有用到 unordered_set&#xff1a;存储无序元素unordered_map&#xff1a;存储无序键值对 代码随想录 常用代码模板2——数据结构 - AcWing C知识回顾-CSDN博客 1.两数之和5/5【30min】 1. 两数之和 - 力扣&#xff08;LeetCode&…...

【STM32 学习笔记】GPIO输入与输出

GPIO详解 一、GPIO基本概念 GPIO&#xff08;通用输入输出&#xff09;是微控制器与外部设备交互的核心接口&#xff0c;具有以下特性&#xff1a; 可编程控制输入/输出模式支持数字信号的读取与输出集成多种保护机制复用功能支持片上外设连接 二、GPIO位结构解析 2.1 保护二…...

网狐飞云娱乐三端源码深度实测:组件结构拆解与部署Bug复盘指南(附代码分析)

本文基于“网狐系列三网通飞云娱乐电玩”源码包&#xff0c;从项目结构、界面逻辑、三端兼容性、机器人机制、本地部署实践等多维角度进行全面剖析&#xff0c;并附录多个真实报错修复案例与源码片段。本组件适用于本地学习、框架研究与技术测试&#xff0c;不具备线上部署条件…...

HTML5好看的水果蔬菜在线商城网站源码系列模板9

文章目录 1.设计来源1.1 主界面1.2 商品界面1.3 购物车界面1.4 心愿列表界面1.5 商品信息界面1.6 博客界面1.7 关于我们界面1.8 联系我们界面1.9 常见问题界面1.10 登录界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&…...

【ArcGIS Pro微课1000例】0066:多边形要素添加折点,将曲线线段(贝塞尔、圆弧和椭圆弧)替换为线段?

文章目录 增密工具介绍举例1. 圆2. 椭圆3. 折线增密工具介绍 ArcGIS Pro中提供了【增密】工具,作用是: 沿线或多边形要素添加折点。还可将曲线线段(贝塞尔、圆弧和椭圆弧)替换为线段。 原理图如下所示: 用法: 通过距离参数对直线段进行增密。利用距离、最大偏转角或最大…...

虚拟dom是什么,他有什么好处

本编&#xff0c;博主将从虚拟dom是什么引出&#xff0c;为什么需要虚拟dom&#xff0c; 虚拟dom的益处 &#xff0c; 为什么需要Diff算法&#xff0c;for循环中key的作用是什么。 1.虚拟dom是什么 虚拟dom就是以js对象的形式表示真实dom结构 例如 const newVNode {type: di…...

算力经济模型推演:从中心化到去中心化算力市场的转变(区块链+智能合约的算力交易原型设计)

一、算力经济的历史脉络与范式转移 1.1 中心化算力市场的演进困境 传统算力市场以超算中心、云计算平台为核心载体&#xff0c;其运营模式呈现强中心化特征。中国移动构建的"四算融合"网络虽实现百万级服务器的智能调度&#xff0c;但动态资源分配仍受制于集中式控…...

数据结构之二叉树(4)

&#xff08;注&#xff1a;本文所示代码均为C&#xff09; 一.二叉树选择题 根据二叉树的性质&#xff0c;完成以下选择题: &#xff08;1&#xff09;第一组 某二叉树共有 399 个结点&#xff0c;其中有 199 个度为 2 的结点&#xff0c;则该二叉树中的叶子结点数为&am…...

互联网与无线广播:数字时代与模拟时代的通讯双轨制-优雅草卓伊凡

互联网与无线广播&#xff1a;数字时代与模拟时代的通讯双轨制-优雅草卓伊凡 一、无线广播&#xff1a;穿越百年的电磁波通讯 1.1 无线广播的技术本质 当卓伊凡深入研究无线广播技术后&#xff0c;发现这套诞生于19世纪末的通讯系统蕴含着惊人的智慧。无线广播本质上是一种单…...

Java 集合线程安全

在高并发环境下&#xff0c;Java集合ArrayList和HashMap读写可能会出现安全问题。其中有几个解决办法&#xff1a; 使用Collections类方法Collections.synchronizedList和Collections.synchronizedMap在Java并发包中提供了CopyOnWriteArrayList和ConcurrentHashMap类 一、Arr…...

解决 Builroot 系统编译 perl 编译报错问题

本文提供一种修复 Builroot 系统编译 perl 编译报错途径 2025-05-04T22:45:08 rm -f pod/perl5261delta.pod 2025-05-04T22:45:08 /usr/bin/ln -s perldelta.pod pod/perl5261delta.pod 2025-05-04T22:45:08 /usr/bin/gcc -c -DPERL_CORE -fwrapv -fpcc-struct-return -pipe -f…...

理解计算机系统_并发编程(1)_并发基础和基于进程的并发

前言 以<深入理解计算机系统>(以下称“本书”)内容为基础&#xff0c;对程序的整个过程进行梳理。本书内容对整个计算机系统做了系统性导引,每部分内容都是单独的一门课.学习深度根据自己需要来定 引入 并发是一种非常重要的机制,用于处理多个指令流.特别是在网…...

详细案例,集成算法

以下是一个使用 随机森林&#xff08;RF&#xff09; 和 XGBoost 解决结构化数据分类问题的完整案例&#xff08;以泰坦尼克号生存预测为例&#xff09;&#xff0c;包含数据处理、建模和结果分析&#xff1a; 案例&#xff1a;泰坦尼克号乘客生存预测 目标&#xff1a;根据乘客…...

57认知干货:AI机器人产业

机器人本质上由可移动的方式和可交互万物的机构组成,即适应不同环境下不同场景的情况,机器人能够做到根据需求调整交互机构和移动方式。因此,随着人工智能技术的发展,AI机器人的产业也将在未来逐步从单一任务的执行者,发展为能够完成复杂多样任务的智能体。 在未来的社会…...

谷歌 NotebookLM 支持生成中文播客

谷歌 NotebookLM 支持生成中文播客。 2025 年 4 月 29 日&#xff0c;NotebookLM 宣布其 “音频概览”&#xff08;Audio Overviews&#xff09;功能新增 76 种语言支持&#xff0c;其中包括中文。用户只需将文档、笔记、研究材料等上传至 NotebookLM&#xff0c;然后在设置中选…...

【MySQL数据库】用户管理

目录 1&#xff0c;用户信息 2&#xff0c;创建/删除/修改用户 3&#xff0c;数据库的权限 MySQL数据库安装完之后&#xff0c;我们最开始时使用的都是 root 用户&#xff0c;其它用户通常无法进行操作。因此&#xff0c;MySQL数据库需要对用户进行管理。 1&#xff0c;用户…...

杜教筛原理,实现与时间复杂度分析

引例 洛谷 P4213 【模板】杜教筛 题目描述 给定一个正整数&#xff0c;求 a n s 1 ∑ i 1 n φ ( i ) ans_1\sum_{i1}^n\varphi(i) ans1​i1∑n​φ(i) a n s 2 ∑ i 1 n μ ( i ) ans_2\sum_{i1}^n \mu(i) ans2​i1∑n​μ(i) 输入格式 本题单测试点内有多组数据。 输入的…...

【时时三省】(C语言基础)怎样定义和引用一维数组

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 一维数组是数组中最简单的&#xff0c;它的元素只需要用数组名加一个下标&#xff0c;就能唯一地确定。如上面介绍的学生成绩数组s就是一维数组。有的数组&#xff0c;其元素要指定两个下标才…...

二叉搜索树的最近祖先(递归遍历)

235. 二叉搜索树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; class Solution { private:TreeNode*traversal(TreeNode*cur,TreeNode*p,TreeNode*q){if(curNULL){return NULL;}if(cur->val>p->val&&cur->val>q->val){TreeNode*lefttrave…...

蘑菇管理——AI与思维模型【94】

一、定义 蘑菇管理思维模型是一种形象地描述组织对待新员工或初入职场者的管理方式及相关现象的思维模型。它将新员工或初入职场者比作蘑菇&#xff0c;这些人在初期往往被置于阴暗的角落&#xff08;不受重视的部门&#xff0c;或打杂跑腿的工作&#xff09;&#xff0c;浇上…...

Uni-app 组件使用

在前端开发领域&#xff0c;能够高效地创建跨平台应用是开发者们一直追求的目标。Uni-app 凭借其 “一次开发&#xff0c;多端部署” 的特性&#xff0c;成为了众多开发者的首选框架。而组件作为 Uni-app 开发的基础单元&#xff0c;合理运用组件能够极大地提升开发效率和代码的…...

湖北理元理律师事务所:债务优化的合规化探索

在债务处置领域&#xff0c;合法性与有效性往往难以兼得。湖北理元理律师事务所通过标准化服务流程设计&#xff0c;尝试在二者间建立平衡点&#xff0c;其经验为行业提供了可参考的实践样本。 四阶服务模型 1.合规审查 核查债务来源合法性&#xff0c;重点筛查&#xff1a; …...

PISI:眼图1:眼图相关基本概念

0 英文缩写 TIE&#xff08;Time Interval Error&#xff09;时间间隔误差&#xff0c;UI&#xff08;Unit Interval&#xff09;单位间隔PDF&#xff08;Probability Density Function&#xff09;概率密度函数BER&#xff08;Bit Error Rate&#xff09;误码率TJ&#xff08…...

初试C++报错并解决记录

初试C报错并解决记录 报错开始解决问题记录1、考虑应该是没有指定dll位置 无法打开.lib文件1. 应该是没有包含Lib文件 问题解决➡ C 文件需要添加路径的位置记录&#xff1a; 显示调用dll文件位置注意问题解决➡调用位置&#xff1a; 调用人家的.h文件的方法&#xff08;项目使…...

Android运行时ART加载类和方法的过程分析

目录 一,概述 二,ART运行时的入口 一,概述 既然ART运行时执行的都是翻译DEX字节码后得到的本地机器指令了&#xff0c;为什么还需要在OAT文件中包含DEX文件&#xff0c;并且将它加载到内存去呢&#xff1f;这是因为ART运行时提供了Java虚拟机接口&#xff0c;而要实现Java虚…...

【力扣刷题记录】hot100错题本(一)

1. 简单题 我的答案&#xff1a;时间复杂度过高&#xff1a;O(N^3) class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:for num in nums:if (target - num) in nums:#多余for i in range(len(nums)):if nums[i] num :for j in range(i1,len(nu…...

Android运行时ART加载OAT文件的过程

目录 一,概述 1.1 OAT是如何产生的 一,概述 OAT文件是一种Android私有ELF文件格式&#xff0c;它不仅包含有从DEX文件翻译而来的本地机器指令&#xff0c;还包含有原来的DEX文件内容。这使得我们无需重新编译原有的APK就可以让它正常地在ART里面运行&#xff0c;也就是我们不…...

Python读取comsol仿真导出数据并绘图

文章目录 comsol数据导出python读取文件python绘制云图python进一步分析数据 完整代码 当我们使用comsol&#xff0c;ansys等仿真工具进行仿真后&#xff0c;难免需要对仿真结果进行导出并进一步处理分析。 今天小姜以comsol的一个简单磁场仿真为例&#xff0c;详细介绍如何对c…...

cloudfare+gmail 配置 smtp 邮箱

这里介绍有一个域名后&#xff0c;不需要服务器&#xff0c;就可以实现 cloudfare gmail 的 邮箱收发。 为什么还需要 gmail 的 smtp 功能&#xff0c;因为 cloudfare 默认只是对 email 进行转发&#xff0c;就是只能收邮件而不能发送邮件&#xff0c;故使用 gmail 的功能来进…...