大数据的left_join

刷算法题:

第一遍:1.看5分钟,没思路看题解

2.通过题解改进自己的解法,并且要写每行的注释以及自己的思路。

3.思考自己做到了题解的哪一步,下次怎么才能做对(总结方法)

4.整理到自己的自媒体平台。

5.再刷重复的类似的题目,根据时间和任务安排刷哪几个板块

6.用c++语言 都刷过一遍了 就刷中等

一.题目

用c++写一个函数,内存有限,给了两个表格,怎么实现left join?(滑动窗口法)两个表都无法直接加载到内存里 ,并且给出两个二维vector代表文件即可

二、反思

1.自己的解法

cpp 复制代码
#include <iostream>
#include <vector>
#include <unordered_map>
#include <string>

// 定义一行数据类型
using Row = std::vector<std::string>;

// 滑动窗口方式实现 LEFT JOIN
std::vector<Row> leftJoin(const std::vector<Row>& table1, const std::vector<Row>& table2, size_t joinCol1, size_t joinCol2, size_t chunkSize) {
    std::vector<Row> result; // 存储最终的结果

    size_t table1Size = table1.size();
    size_t table2Size = table2.size();

    for (size_t i = 0; i < table1Size; i += chunkSize) {
        size_t end = std::min(i + chunkSize, table1Size);

        // 将当前窗口的数据加载到内存中
        std::vector<Row> table1Chunk(table1.begin() + i, table1.begin() + end);

        // 构建右表的哈希索引
        std::unordered_multimap<std::string, Row> table2Map;
        for (const auto& row : table2) {
            if (joinCol2 < row.size()) {
                table2Map.emplace(row[joinCol2], row);
            }
        }

        // 对当前窗口的左表进行匹配
        for (const auto& row1 : table1Chunk) {
            bool matched = false;

            if (joinCol1 < row1.size()) {
                auto range = table2Map.equal_range(row1[joinCol1]);

                for (auto it = range.first; it != range.second; ++it) {
                    Row joinedRow = row1; // 复制左表当前行
                    joinedRow.insert(joinedRow.end(), it->second.begin(), it->second.end());
                    result.push_back(joinedRow);
                    matched = true;
                }
            }

            // 如果没有匹配项,则补空
            if (!matched) {
                Row joinedRow = row1;
                joinedRow.resize(row1.size() + table2[0].size(), "NULL");
                result.push_back(joinedRow);
            }
        }
    }

    return result;
}

int main() {
    // 示例表格1(左表)
    std::vector<Row> table1 = {
        {"1", "Alice"},
        {"2", "Bob"},
        {"3", "Charlie"}
    };

    // 示例表格2(右表)
    std::vector<Row> table2 = {
        {"1", "New York"},
        {"2", "Los Angeles"}
    };

    // 左表的连接列和右表的连接列索引
    size_t joinCol1 = 0;
    size_t joinCol2 = 0;

    // 设置块大小
    size_t chunkSize = 2;

    // 执行 LEFT JOIN
    auto result = leftJoin(table1, table2, joinCol1, joinCol2, chunkSize);

    // 输出结果
    for (const auto& row : result) {
        for (const auto& col : row) {
            std::cout << col << "\t";
        }
        std::cout << "\n";
    }

    return 0;
}

2.题目的解法

cpp 复制代码
2

3.思路的异同

三.进步的地方

面试的时候遇到的,根本做不出来,忘记multimap这个数据结构了。

相关推荐
汉克老师14 分钟前
CSP-J 初赛(以满分为目标):第二十六课 《图的遍历——DFS深度优先搜索——从“树的先序遍历”走进真正的图世界》
c++·csp-j·小学生·学c++编程
程序猿编码20 分钟前
基于GGML的C++17轻量化语音推理引擎:说话人识别与语音分析技术全解析
开发语言·c++·pytorch·深度学习·神经网络·大模型
leihefeng27 分钟前
手写数字识别:KNN vs 逻辑回归实战
python·算法·机器学习·逻辑回归·scikit-learn
影视飓风TIM1 小时前
C++哈希表深度剖析:冲突处理、rehash、迭代器与unordered容器封装
c++·哈希算法·散列表
全栈技术负责人1 小时前
DeepSeek Harness 业务工具权限插件 dsh-tool-permission设计思路
网络·算法·ai·ai编程
mmmmath_31 小时前
面试题 02.07. 链表相交
算法·链表
qq_246839751 小时前
postgresql xxhash64 哈希函数实现
数据库·postgresql·哈希算法
C++ 老炮儿的技术栈1 小时前
Qt5 使用 QPainter 绘制阿基米德螺线
开发语言·c++·windows·qt·代码化
圣保罗的大教堂1 小时前
leetcode 3903. 最小稳定下标 I 简单
leetcode
residual_fan2 小时前
特征级SMOTE(Feature-level SMOTE)论文分享
人工智能·算法·数据挖掘·数据分析