首页 > 编程语言 >《算法笔记》学习记录

《算法笔记》学习记录

时间:2023-12-28 15:24:55浏览次数:36  
标签:排列 cur 填入 记录 int 笔记 ++ 算法 hashTable

算法笔记

散列

  • 字符串散列
// 把字符串当成26进制数,转换成10进制,建立映射关系
int hash(char S[], int len) {
    int res = 0;
    for (int i = 0; i < len; ++i) {
        res = res * 26 + (S[i] - 'A');
    }
    return res;
}

/*
 * 给出n个字符串,每个字符串由三位大写字母构成;
 * 再给出m个字符串,查询每个字符串在n个字符串中出现的次数
 */
void fun() {
    int n, m;
    char S[100][4], temp[4];
    int hashMap[26 * 26 * 26];

    scanf("%d%d", &n, &m);
    // 映射成10进制放入hash表,并统计个数
    for (int i = 0; i < n; ++i) {
        scanf("%s", S[i]);
        int t = hash(S[i], 3);
        hashMap[t]++;
    }
    
    for (int i = 0; i < m; ++i) {
        scanf("%s", temp);
        int t = hash(temp, 3);
        printf("count=%d\n", hashMap[t]);
    }
}

递归

  • 全排列
// 输出1~n的全排列。分成若干子问题:以1开头的全排列,2开头的全排列...
// 按顺序往P的第1~n位中填入数字,当前已经填好P[1]到P[cur-1],正准备填入P[cur]
// 从小到大枚举1~n,若枚举的数字i没有出现在P中,则P[cur]填入i,同时hashTable[i]置为true;
// 然后递归处理cur+1位置的数字;处理完P[cur]=i的子问题,再把hashTable[i]置为false,P[cur]填入下个数字
void generateP(int P[], int hashTable[], int n, int cur) {
    // n个数字都已排列完毕
    if (cur == n + 1) {
        for (int i = 1; i <= n; ++i) {
            printf("%d", P[i]);
        }
        puts("\n");
        return;
    }
    // 从第一个开始往输出序列P里放
    for (int i = 1; i <= n; ++i) {
        // i不在P中
        if (hashTable[i] == false) {
            // 放到当前位置
            P[cur] = i;
            hashTable[i] = true;
            generateP(P, hashTable, n, cur + 1);
            hashTable[i] = false;
        }
    }
}

// 1~3的全排列
void generate(){
    int P[3];
    int hashTable[11];
    for (int i = 0; i < 11; ++i) {
        hashTable[i] = false;
    }

    // 输出全排列
    generateP(P, hashTable, 3, 1);
}
int count; // 记录是第几个排列,从第一个找到第k个
int target; // 要找到那个排列的序号
char res[10]; // 输出结果
int flag; // 为true时,停止所有递归

// 输出1~n的全排列。分成若干子问题:以1开头的全排列,2开头的全排列...
// 按顺序往P的第1~n位中填入数字,当前已经填好P[1]到P[cur-1],正准备填入P[cur]
// 从小到大枚举1~n,若枚举的数字i没有出现在P中,则P[cur]填入i,同时hashTable[i]置为true;
// 然后递归处理cur+1位置的数字;处理完P[cur]=i的子问题,再把hashTable[i]置为false,P[cur]填入下个数字
void generate(int P[], int n, int cur, int hashTable[]) {
    if (flag) return;
    // P中元素放满了
    if (cur == n + 1) {
        count++;
        if (count == target) {
            for (int i = 1; i <= n; ++i) {
                res[i - 1] = (char) (P[i] + '0');
                res[i] = '\0';
            }
            flag = true; // 停止所有递归
        }
        // 停止此次递归
        return;
    }
    // P中还没放满
    for (int i = 1; i <= n; ++i) {
        // i还没有出现在P中
        if (hashTable[i] == false) {
            P[cur] = i;
            hashTable[i] = true;
            // 处理子问题
            generate(P, n, cur + 1, hashTable);
            hashTable[i] = false;
        }
    }
}

// 1 <= n <= 9,返回第 k 个排列。
char *getPermutation(int n, int k) {
    count = 0;
    target = k;
    flag = false;
    int P[10];
    int hashTable[10];
    for (int i = 0; i < 10; ++i) {
        hashTable[i] = false;
    }
    generate(P, n, 1, hashTable);
    return res;
}
  • n皇后问题

    全排列的暴力法

int count;

void generateP(int P[], int n, int cur, int hashTable[]) {
    // 形成了一个全排列
    if (cur == n + 1) {
        bool flag = true;
        // i, j表示两个皇后所在的行;P[i],P[j]表示所在的列
        for (int i = 1; i <= n; ++i) {
            for (int j = i + 1; j <= n; ++j) {
                // 由于已经是不同行不同列,只需要判断是否在同一斜线
                if ((j - i) == abs(P[i] - P[j])) {
                    flag = false;
                    break;
                }
            }
        }
        if (flag) count++;
        return;
    }

    for (int i = 1; i <= n; ++i) {
        if (hashTable[i] == false) {
            P[cur] = i;
            hashTable[i] = true;
            generateP(P, n, cur + 1, hashTable);
            hashTable[i] = false;
        }
    }
}

int totalNQueens(int n) {
    count = 0;
    int P[10];
    int hashTable[10];
    for (int i = 0; i < 10; ++i) {
        hashTable[i] = false;
    }
    generateP(P, n, 1, hashTable);
    return count;
}

优化版

void generateP(int P[], int n, int cur, int hashTable[]) {
    if (cur == n + 1) {
        count++;
        return;
    }

    for (int i = 1; i <= n; ++i) {
        if (hashTable[i] == false) {
            bool flag = true;
            // 先判断第cur行和前面的行有没有不冲突的地方可以放
            for (int j = 1; j < cur; ++j) {
                if ((cur - j) == abs(i - P[j])) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                P[cur] = i;
                hashTable[i] = true;
                generateP(P, n, cur + 1, hashTable);
                hashTable[i] = false;
            }
        }
    }
}

int totalNQueens(int n) {
    count = 0;
    int P[10];
    int hashTable[10];
    for (int i = 0; i < 10; ++i) {
        hashTable[i] = false;
    }
    generateP(P, n, 1, hashTable);
    return count;
}

标签:排列,cur,填入,记录,int,笔记,++,算法,hashTable
From: https://www.cnblogs.com/sprinining/p/17932779.html

相关文章

  • CentOS 8 安装笔记
    CentOS8安装笔记作者主页:sysin.org第一部分概述初始版本:CentOS8.0.1905继RHEL8发布之后,CentOS社区也发布了让人期待已久的CentOS8,并发布了两种模式:CentOSstream:滚动发布的Linux发行版,适用于需要频繁更新的开发者CentOS:类似RHEL8的稳定操作系统,系统管理员可以用其部......
  • 《生物信息学算法导论》是2007年化学工业出版社出版的图书,作者是(美)N.C.琼斯 ,(美)P.A
    目前,可供本科学生使用的生物信息学著作为数不多,本书恰恰是其中的一本。国内生物信息学,计算生物学、计算数学等领域的本科生、研究生和其他研究人员,会从书中汲取基本的算法原理、解决实际问题的方法和技巧,进而更好地从事相关研究工作。目录 播报编辑1绪论2算法与复杂性......
  • 大模型 RLHF 实战!【OpenAI独家绝技RLHF!RLHF的替代算法DPO!Claude 暗黑科技 RAIHF!】
    大模型RLHF实战大模型RLHF实战RLHF:OpenAI独家绝技RLHF的问题DPO直接偏好优化算法:RLHF的替代算法公式1-4:KL散度下奖励的最大化目标使用DPO微调Llama2RAIHF 大模型RLHF实战RLHF(基于人类反馈的强化学习)分为3个阶段:预训练:为了生成内容,需要一个生成式的预训练语言模......
  • MongoDB Oplogs 到底都记录了什么 与 智者老冯
    最近董宇辉的事情,让我意识到,如果光一味的搞技术,那么对于人生和生活是不完整的,后序在撰写一些技术文章的时候,会带有一些对于当前热点事件的一些感触和反思,也希望能找到一些有同样想法的人,终究人生的道路是孤独的,如果在孤独中能找到一些人能对你有一些共鸣,那是一件幸福的事情。这里先......
  • 文心一言 VS 讯飞星火 VS chatgpt (158)-- 算法导论12.3 5题
    五、用go语言,假设为每个结点换一种设计,属性x.p指向x的双亲,属性x.succ指向x的后继。试给出使用这种表示法的二叉搜索树T上SEARCH、INSERT和DELETE操作的伪代码。这些伪代码应在O(h)时间内执行完,其中h为树T的高度。(提示:应该设计一个返回某个结点的双亲的子过程。......
  • 读书笔记2
    孟凡荣等所著《多版本TPR树》。文中参考TR树构建了多版本TPR树。文中称多数算法参考TR树,我并没有看过TR树的文献,故具体算法尚不清楚。仅从文中所述来看TPR树是一种全时态的索引。其中的每一条记录都有一个起始时间和一个终止时间,并设置一个特定的终止时间代表“未来”,以表示这个记......
  • 简单记录下python视频提取语音,语音转文字(web版本)
    一、直接贴代码,有些离线文件需要下载,python依赖包也需要下载。#coding=utf-8fromflaskimportFlask,render_template_string,jsonify,requestfromflask_corsimportCORSfromtkinterimportfiledialogfrompydubimportAudioSegmentfromnoisereduceimportredu......
  • 2023最新中级难度Fast API面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自[面试宝典-中级难度FastAPI面试题合集](https://offer.houxu6.top/tag/FastAPI)问:FastAPI是一个基于HTTP协议的PythonWeb框架,请问FastAPI有哪些特点和优势?FastAPI是一个现代、高性能的PythonWeb框架,用于构建RESTfulAPI和Web服务。以下是Fas......
  • 2023最新高级难度Fast API面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自[面试宝典-高级难度FastAPI面试题合集](https://offer.houxu6.top/tag/FastAPI)问:请简述FastAPI的优缺点,并给出一些应用场景。FastAPI是一个现代、快速且高性能的PythonWeb框架,用于构建RESTfulAPI和Web应用。它基于标准的Python类......
  • 炼丹记录
    8层transformerself.transformer=TransformerModel(d_model=32,nhead=4,num_encoder_layers=8,dim_feedforward=128,max_len=512)self.transformer2=TransformerModel(d_model=32,nhead=4,......