PTA散列表平方探测法解决冲突

PTA散列表平方探测法解决冲突

核心问题

  当所有的位置都被填上了,且不能插入关键词,要进入死循环了怎么办?

题目

  本题的任务很简单:将给定的无重复正整数序列插入一个散列表,输出每个输入的数字在表中的位置。所用的散列函数是 H(key)=key%TSize,其中 TSize 是散列表的表长。要求用平方探测法(只增不减,即H(Key)+i2)解决冲突.
注意散列表的表长最好是个素数。如果输入给定的表长不是素数,你必须将表长重新定义为大于给定表长的最小素数。

输入格式

  首先第一行给出两个正整数 MSize(≤104)和 N(≤MSize),分别对应输入的表长和输入数字的个数。随后第二行给出 N 个不重复的正整数,数字间以空格分隔。

输出格式

  在一行中按照输入的顺序给出每个数字在散列表中的位置(下标从 0 开始)。如果某个数字无法插入,就在其位置上输出 -。输出间以 1 个空格分隔,行首尾不得有多余空格。

输入样例

4 4
10 6 4 15

输出样例

0 1 4 -

AC代码

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <map>
using namespace std;
int is(int n) {
    if(n == 1)return 0;
    if(n == 2 || n == 3)return 1;
    if(n % 6 != 1 && n % 6 != 5)return 0;
    for(int i = 5;i * i <= n;i += 6) 
        if(n % i == 0 || n % (i + 2) == 0)return 0;
    return 1;
}
int main() {
    int m,n;
    int s,p,v[10007] = {0};
    scanf("%d %d",&m,&n);
    while(!is(m))m ++;

//因为平方以后只需要到m,就能完全探测到整个散列表,具体去看数学推导
    for(int i = 0;i < n;i ++) {
        p = -1;//判断是否插入成功
        scanf("%d",&s);
        for(int j = 0;j < m;j ++) {
            if(!v[(s + j * j) % m]) {
                v[(s + j * j) % m] = 1;
                p = (s + j * j) % m;
                break;
            }
        }
        if(i)putchar(' ');
        if(p == -1)printf("-");
        else printf("%d",p);
    }
}

核心代码

//让从i到n,如果关键词能够查下去的则一定能,否则不能
for(int j = 0;j < m;j ++) {
            if(!v[(s + j * j) % m]) {
                v[(s + j * j) % m] = 1;
                p = (s + j * j) % m;
                break;
            }
        }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用k近邻识别手写数字,需要以下步骤: 1. 准备手写数字数据集。可以使用MNIST数据集,也可以使用其他手写数字数据集。 2. 对数据集进行预处理。将每个图像转换为一个向量,并将像素值从0到255的范围转换为0到1的范围。 3. 将数据集分为训练集和测试集。一般使用70%的数据作为训练集,30%的数据作为测试集。 4. 使用k近邻算法对测试集中的每个图像进行分类。对于每个测试图像,找到与它最近的k个训练图像,并将它们的标签进行统计。最终,将测试图像归为出现最多的标签类别。 下面是一个使用k近邻算法识别手写数字的Python代码示例: ```python from sklearn.datasets import load_digits from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score # 加载手写数字数据集 digits = load_digits() # 将数据集分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.3) # 创建K近邻分类器 knn = KNeighborsClassifier(n_neighbors=3) # 训练K近邻分类器 knn.fit(X_train, y_train) # 对测试集进行预测 y_pred = knn.predict(X_test) # 计算分类器的准确率 accuracy = accuracy_score(y_test, y_pred) print("准确率:", accuracy) ``` 在这个示例中,我们使用了scikit-learn库中的KNeighborsClassifier类来实现k近邻算法。我们将k设置为3,即对于每个测试图像,找到距离它最近的3个训练图像。 最后,我们使用accuracy_score函数计算分类器的准确率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值