大学院-筆記試験練習:线性代数和数据结构(8)

大学院-筆記試験練習:线性代数和数据结构(8)

1-前言

为了升到自己目标的大学院,所作的努力和学习,这里是线性代数和数据结构部分。

2-线性代数-题目

3-线性代数-参考答案



4-数据结构-题目

5-数据结构-参考答案

一、【第 1 问】哈希法(翻译 + 解释)

原题翻译

(1)

"什么是哈希值的冲突?请简要说明。"

👉 翻译:

不同的输入数据,通过哈希函数计算后,得到了相同的哈希值 ,这种情况称为哈希冲突。


(2)

在内部哈希法(开放地址法)中,考虑以下两种哈希函数序列((k=0,1,2,\dots)):

f_k(x) = (h_1(x) + k) \\bmod M

g_k(x) = (h_1(x) + k h_2(x)) \\bmod M

其中:

  • (M):足够大的素数
  • (a \bmod b):(a) 除以 (b) 的余数

h_1(x) = x \\bmod M

h_2(x) = 1 + (x \\bmod (M-1))


接下来这段是整题的核心

设 (N) 是远大于 (M) 的整数,从 (N) 未满的正整数中均匀随机选取 (x,y)。

  • 当

    f_0(x)=f_0(y)

    时,

    f_1(x)=f_1(y)

    的概率记为 §

  • 当

    g_0(x)=g_0(y)

    时,

    g_1(x)=g_1(y)

    的概率记为 (q)

要求:填空 A--D


这一问到底在考什么?(非常重要)

不是让你算复杂概率,而是在考你是否理解:

🔑 核心对比

方法 本质
(f_k) 线性探查(一步一步 +1)
(g_k) 双重哈希(跳步长度与数据有关)

👉 如果第一次冲突了:

  • 线性探查:后面还容易继续冲突
  • 双重哈希:第二次冲突的概率更低

标准结论(直接给答案)

  • 若 (f_0(x)=f_0(y)),那么

    f_1(x)=f_1(y) \\text{ 一定成立}

    👉 所以

    \\boxed{p = 1}

  • 双重哈希中,

    g_1(x)=g_1(y)

    不一定成立,概率更小


✅ 第 1 问填空答案

空 答案 含义
A 1 线性探查下必然再次冲突
B 大きい p 比 q 大
C (g_k(x)) 更优(双重哈希)
D (f_k(x)) 较差(线性探查)

📌 整句话的含义是:

因为线性探查在发生一次冲突后,后续仍然高概率冲突,而双重哈希能有效分散冲突,所以在内部哈希法中,使用 (g_k(x)) 比使用 (f_k(x)) 期望冲突次数更少。


二、【第 2 问】C 语言 + 哈希表(翻译 + 解释)


原题在说什么(翻译)

给定程序 main.c(C99),

它使用 hash.h 中的函数来管理一个正整数集合:

c 复制代码
void initT();          // 初始化哈希表
void insertT(v);       // 插入 v,失败则结束程序
int searchT(v);        // 若存在返回 1,否则 0

并且:

  • insertT 和 searchT 的时间复杂度都是 O(1)

输入格式

  1. 输入两个整数 n, K
  2. 输入 n 个互不相同的正整数 x1, x2, ..., xn

输出要求

输出满足:

1 \\le i \< j \\le n,\\quad x_i + x_j = K

的组合对数 (m)。


这一问在考什么?

👉 经典算法题:Two Sum(两数之和)

但重点不是算法竞赛,而是:

  • 是否想到用 哈希表
  • 是否能做到 O(n),而不是 (O(n^2))
  • 是否会避免重复计数

正确思路(考试版)

思路一句话

先把所有数放进哈希表,再对每个 (x_i),检查 (K-x_i) 是否存在。


✅ 标准答案(E 中应写的代码)

c 复制代码
// 初始化哈希表
initT();

// 插入所有元素
for (long long int i = 0; i < n; i++) {
    insertT(x[i]);
}

// 统计满足 xi + xj = K 的对数
for (long long int i = 0; i < n; i++) {
    long long int y = K - x[i];
    if (y <= 0) continue;        // 题目保证都是正整数
    if (y == x[i]) continue;    // 排除 i = j
    if (searchT(y)) {
        m++;
    }
}

// 每一对被数了两次
m /= 2;

时间复杂度

  • 插入:(O(n))
  • 查询:(O(n))
  • 总体:

    \\boxed{O(n)}

👉 这正是题目要求的"尽量高效"


三、整题一句话总结(非常重要)

这道题在考:

❗ 你是否理解哈希,而不是只会写哈希

具体包括:

  • 什么是冲突
  • 为什么双重哈希更好
  • 如何把哈希用于实际算法
  • 如何用 C 写出工程级代码

6-总结

训练成长。!!

相关推荐
罗湖老棍子9 小时前
【例 1】Sightseeing Trip(信息学奥赛一本通- P1494)(洛谷-P10927)
数据结构·算法·图论·最短路·floyd·最小环
郝亚军12 小时前
manifest 中 `sha256` 与 `signValue` 的作用
java·开发语言·数据结构
Nil20812 小时前
LeetCode 283移动零
数据结构·算法·leetcode
库玛西15 小时前
外部排序全解析:败者树、置换-选择排序与最佳归并树
c语言·数据结构·c++·笔记·考研·算法
花间相见18 小时前
【计算基础|MySQL08】索引(上):为什么是 B+ 树
数据结构·mysql·算法·架构
夊18 小时前
数据结构第二课:顺序表揭秘
数据结构
OKkankan20 小时前
python 进阶(三):面向对象进阶——从“会写 class”到设计可维护的后端对象
开发语言·数据结构·python
I Am a robert girl21 小时前
MeqMuon 源码级拆解:当优化器开始“配平”更新矩阵
深度学习·线性代数·矩阵·优化器·大模型预训练·muon·矩阵正交化
闻缺陷则喜何志丹21 小时前
vc入门宝典(九)
数据结构·list·mfc·存储·null·class
quaer1 天前
弗洛伊德算法--判圈法寻找环的入口O(n) O(1)
数据结构·算法