1.KMP查找算法

1.1 用途

  • 给定一个主串,一个查找串,需要找到查找串在主串中第一次出现的位置(下标)。

1.2 方法

  • 要求主串不回头(就是只想主串的指针不向后移动),查找串(匹配串)回头跳转。
  • 这是一种以空间换时间的方法。

1.3 串的前缀与后缀

  • 1.字符串的前缀是指字符串的任意首部,比如字符串“abbc”的前缀有 a ab abb ;
  • 2.字符串的后缀是指字符串的任意尾部,比如字符串“abbc”的后缀有 c bc bbc ;

1.4 KMP算法就是找两个串中的最大相等的前缀和后缀。

1.5 KMP算法的核心就是计算 Next 数组。

1.6 求 “aababaaabbcabbaa” 的 Next 数组

  • 1.即使用一个和字符串等长的数组来存储当前字符串前缀与后缀最大的相等长度。
  • 2.Next 数组为 [0101012230010012] ;

1.7 使用 Next 数组进行匹配

1.8 KMP算法步骤

  • 1.生成 Next 数组;
  • 2.进行匹配;
int* GetNext(char* match)
{int* p_next = NULL;p_next = (int*)malloc(sizeof(int)*strlen(match));p_next[0] = 0;int i = 1;int j = i - 1;while(i < strlen(match)){if(match[i] == match[p_next[j]]){p_next[i] = p_next[j] + 1;i++;j = i - 1;}else if(p_next[j] == 0){p_next[i] = 0;i++;j = i - 1;}else{// 跳转j = p_next[j] - 1;}}return p_next;
}int KMP(char* str, char* match)
{if(str == NULL || match == NULL)return -1;// 计算 Next 数组int* p_next = NULL;p_next = GetNext(match);// 匹配int i = 0;int j = 0;while(i < strlen(str) && j < strlen(match)){if(str[i] == match[j]){i++;j++;}else{// 跳转if(j == 0){i++;}else{j = p_next[j-1];}}}if(j == strlen(match)){return i - j;}else{return -1;}
}

2.Sunday算法

2.1 使用一个256维的数组来存储从右到左match的字母第一次出现的位置。

2.2 实现算法

int Sunday(char* str, char* match)
{if(str == NULL || match == NULL)return -1;// 获得 Next 数组int* p_next = NULL;p_next = (int*)malloc(sizeof(int)*256);memset(p_next, -1, sizeof(int)*256);int i;for(i=0; i<strlen(match); i++){p_next[match[i]] = i;}// 匹配int j;int k;i = 0;j = 0;while(i < strlen(str) && j < strlen(match)){k = i;while(str[i] == match[j] && i < strlen(str) && j < strlen(match)){i++;j++;}if(j == strlen(match)){return i - j;}// 跳转if(k+strlen(match) < strlen(str)){k = k + strlen(match) - p_next[str[k+strlen(match)]];i = k;j = 0;}else{return -1;}}
}

3.字典树

3.1 功能

  • 1.查找
  • 2.计数
  • 3.排序

3.2 查找树没有空树的概念

3.3 每个节点不是字母,而是代表字母

3.4 实现

typedef struct trie
{int n_count;char* str;struct trie* p_character[26];
}TrieTree;TrieTree* GetNode()
{TrieTree* p_node = NULL;p_node = (TrieTree*)malloc(sizeof(TrieTree));memset(p_node, 0, sizeof(TrieTree));return p_node;
}void AddWord(TrieTree* p_tree, char* str)
{int i = 0;TrieTree* p_temp = NULL;while(i < strlen(str)){if(p_tree->p_character[str[i]-97] == NULL){p_tree->p_character[str[i]-97] = GetNode();}p_tree = p_tree->p_character[str[i]-97];i++;}// 末尾标志p_tree->str = str;p_tree->n_count++;
}TrieTree* CreateTrie(char* str[], int len)
{if(str == NULL || len <= 0)return NULL;// 定义根节点TrieTree* p_tree = NULL;p_tree = GetNode();// 添加单词int i;for(i=0; i<len; i++){AddWord(p_tree, str[i]);}return p_tree;
}void Search(TrieTree* p_tree, char* str)
{if(p_tree == NULL || str == NULL)return;int i = 0;while(i < strlen(str)){if(p_tree->p_character[str[i]-97] == NULL){printf("TAT failed.\n");return;}p_tree = p_tree->p_character[str[i]-97];i++;}// 检测末尾标志if(p_tree->n_count != 0){printf("%s\n", p_tree->str);return;}else{printf("QAQ failed.\n");return;}
}void Traversal(TrieTree* p_tree)
{if(p_tree == NULL)return;if(p_tree->n_count != 0)printf("%s\n", p_tree->str);int i;for(i=0; i<26; i++)Traversal(p_tree->p_character[i]);
}

Linux与数据结构 2019-4-14相关推荐

  1. go移植linux内核书名叫啥,Go语言移植Linux内核数据结构hlist

    hlist(哈希链表)可以通过相应的Hash算法,迅速找到相关的链表Head及节点. 在有些应用场景,比Go标准库提供的list(一种双向链表)更合适. 依照list.h中的源码,我实现了一个Go语言 ...

  2. 训练日志 2019.1.14

    训练第一天,收获还是比较大的. 下午比赛 A 题是不互素的中国剩余定理模板题,把之前的模版拿过来贴上直接 WA,发现输入的除数与余数正好跟模版反了,改了又 WA 一次,心态崩了,跟 sdz 要的模版, ...

  3. 中国大学MOOC-陈越、何钦铭-数据结构-2019夏期末考试(含答案)

    中国大学MOOC-陈越.何钦铭-数据结构-2019夏期末考试(含答案) 判断题 1-1   对N个不同的数据采用冒泡排序进行从大到小的排序,当元素基本有序时交换元素次数肯定最多. (2分) 1-2   ...

  4. 西邮linux兴趣小组2019,2020补纳面试题

    西邮linux兴趣小组2019,2020补纳面试题 2019补纳 2020补纳 C语言基础 数据结构与算法 GNU Linux常识 关于纳新试题,您需要了解: 本题仅作为面试有限参考 为了代码的简洁, ...

  5. 日常(更新至2019.8.14)

    八月 Camp完之后就开始HDU多校自闭之旅了 第一场连签到题都是网络流这种级别的orz 因为这几场比赛 强行学习了线性基.划分树.支配树和一些奇奇怪怪的可持久化数据结构 算是颇有收获了 还有两场,坚 ...

  6. 中国大学MOOC-陈越、何钦铭-数据结构-2019秋期末考试

    [PTA]中国大学MOOC-陈越.何钦铭-数据结构-2019秋期末考试 一.判断题: 1-1 对N个不同的数据采用冒泡排序进行从大到小的排序,当元素基本有序时交换元素次数肯定最多. [F] 1-2 2 ...

  7. 嵌入式Linux设备驱动程序开发指南14(Linux设备驱动使用DMA)——读书笔记

    Linux设备驱动使用DMA 十四.Linux设备驱动使用DMA 14.1 简介 14.2 缓存一致性 14.3 DMA控制器接口 14.4 流式DMA模块 14.4.1 sdma_sam_m2m.c ...

  8. 中国大学MOOC-陈越、何钦铭-数据结构-2019夏期中考试+解析

    中国大学MOOC-陈越.何钦铭-数据结构-2019夏期中考试+解析 判断题 1-1 用邻接矩阵法存储图,占用的存储空间数只与图中结点个数有关,而与边数无关. (3分)TRUE [解析]:邻接矩阵是用一 ...

  9. Linux桌面新彩虹-Fedora 14 炫酷应用新体验

    Linux桌面新彩虹 --Fedora 14 炫酷应用新体验 Linux的桌面应用已经越广泛其发展势头足以令微软寝食难安,就像一次生物的进化,可爱的小企鹅终于能独挡一面,在诸多厂商和各国政府的支持下, ...

  10. Linux部署Apache ActiveMQ 5.14.1

    Linux部署Apache ActiveMQ 5.14.1 简单记一下,下载地址 http://activemq.apache.org/download.html 一.安装JDK7以上,官方说明:ht ...

最新文章

  1. Android专题-常用第三方框架
  2. css动画Demo---水波动画和边框动画
  3. html图片上下翻滚展示代码
  4. VMware 虚拟机 无法将Ethernet0连接到虚拟网络VMnet0 问题
  5. python随机数程序源码_Python 实现随机数详解及实例代码
  6. 10 个最佳的网站分析方法
  7. Android 开发使用 Gradle 配置构建库模块的工作方式
  8. 至强cpu型号列表_装机必看——CPU型号参数详解
  9. Java 并发编程CyclicBarrier的应用与源码解析(基于ReentrantLock实现)
  10. SAP License:孔乙己,一名ERP顾问
  11. html背景设置为彩色,CSS3 彩色网格背景
  12. 分布式系统常见的事务处理机制
  13. gg修改器ios版下载
  14. 有道网页翻译chrome插件---我用过的最好的翻译插件
  15. keepalived高可用
  16. 阿尔伯塔大学知名计算机工程学教授,阿尔伯塔大学计算机工程硕士解析
  17. ui界面设计是什么:ui设计常用软件
  18. 展厅万能播控软件,中控视频播放器!展馆专用!
  19. java中的\uxxxx
  20. 友盟分享error:包名错误,确认与开放平台包名一致

热门文章

  1. 机器学习中的启发式算法(heuristic algorithm)
  2. 解决jmeter5.4.3在高分辨率下的显示问题
  3. 在houdini中旋转某条曲线上多个点的法线方法(vop方法)
  4. 大数据以及Hadoop相关概念介绍
  5. 微软宣布Azure DNS全面通用
  6. 计算机房通气换气次数,地下制冷机房,水泵房,配电房的排风量按多少换气次数计算...
  7. 小游戏开发怎么选游戏引擎
  8. C++string字符串初始化与使用
  9. 计算机常用软件英文读音,学习英文在线发音的软件有哪些?宝妈推荐的这些超级实用...
  10. 浅谈GFS之---读写文件流程