字符串集合中相互包含关系算法

先介绍下使用场景,源文件是一个excel表格,要根据某一列的值生成正则表达式,为保证正则表达式的准确性,被包含的数据肯定是不能直接生成正则表达式的,例如,产科和妇产科,如果直接生成正则表达式,那么所有妇产科应该匹配到的字符串都能被产科所匹配到,所以将需要实现一种算法,能对整个字符串数组进行相互包含关系的校验
python实现

备选算法:

  • 简单遍历
  • 先按长度排序再遍历
  • 先合并成一个字符串

简单遍历

介绍:
这种介绍起来最简单,就简单的对字符串数组进行遍历,判断当前字符串A是否与其后面的任意字符串存在包含关系(双向判断),长度短的肯定不能包含长度更长的,所以使用判断一次就好,另外,由于是双向判断,所以每次只用比较位于其后的即可
优点:
实现简单
缺点:
慢,特别慢,字符串数量越多,效率阶乘降低


先按长度排序再遍历

介绍:
按长度排序或者叫做按长度分类更合适,根据字符串长度,将源字符串集合分成若干集合,预先需要确定所有数据不重复,然后我们就可以遍历长度较短的数据集合,判断是否被长度更长的集合里的数据所包含
优点:
比简单遍历略快,就是把所有的双向判断部分优化了,每次都判断哪个长度更长无疑是比较浪费时间的
缺点:
还是不够快,效率很大长度取决于数据长度的分布,比如只有长度为2和长度为3的数据,那只用判断2里面的数据是否被3里面的数据包含即可


先合并成一个字符串

介绍:
这种算法其实很大程度依赖于python内部的搜索算法的效率(其实每一种算法都会调用这个find,或者count方法),首先,我们将所有的字符串数组拼接成一个字符串,并用分隔符分开,分隔符分开的目的是为了避免前一个字符串的后半段加上后一个字符串的前半段连起来包含了某个字符串的情况,然后遍历字符串数组,接下来只用判断这个拼接字符串包含每个字符串的次数是否超过1即可,超过1即说明该字符串被其他字符串包含了
优点:
相比较前两种算法,这种算法的效率提升无疑是成倍增加的,每个字符串的判断仅调用了一次find或者count方法,而不是多次
缺点:或者说待提升
其实也就是它的局限性,效率依赖于python内部实现的搜索算法的效率,另外,其他两种算法每次调用find或者count的字符串都是单个字符串,是比较短的,虽然调用了很多次,这种算法虽然每个字符串只调用了一次,但是拼接字符串的长度非常长,所以这也是待提升的地方
提升方案:
这里的提升方案,仅适用于当前情况,由需求的背景我们可以知道,其实我们这里只需返回被包含的字符串集合即可,所以,我们只要确定在拼接字符串中包含字符串的次数大于1即可,也就是不去调用count方法,那样会把整个拼接字符串遍历完再返回结果,我们需要使用find,并且是我们自己重写的find,find的作用是找到第一个匹配项,返回位置,我们可以重写成找到第二个再返回,否则返回-1,这样在拼接字符串中,如果已经发现字符串被包含了两次,我们将可以直接返回了,而不用每次都将拼接字符串遍历完,同样,为了进一步优化,我们还可以根据长度排序后再进行拼接,保证尽可能的早返回
第二次更新
晚上加完班公交车上想到的,上述的提升方案其实还是有一定问题的,查找的速度不固定,因为被包含的和包含的项位置不确定,所以接下来想到的这种优化方案就是,先根据长度进行排序,将长度较长的放在前面,然后只需要判断比当前字符串更长的值组成的字符串是否包含了当前字符串一次即可,这样还不用重写find算法,另外,在排序的时候,可以采取单独一个变量用于记录每次插入字符串后各长度的位置,这样插入就能直接定位到合适的位置再插入,而不用每次判断
代码
这里只给出单纯第三种的代码了,提升方案是针对于大数据量下的优化,对于我的工具中适用性不强,仅给出思路,就不写代码了,有空再写

# 判断两两包含,具体看开发文档包含关系算法第二种
def isContain(dataStr):global splitSign# 被包含列表,需要将被包含的部分提出来baoHanList = []# 其他列表,只要未被包含均放入该列表otherList = []# 过滤第一个分隔符号for childData in dataStr[len(splitSign):].split(splitSign):# 找到两个就返回if -1 !=dataStr.find(childData, dataStr.find(childData) + 1):baoHanList.append(childData)else:otherList.append(childData)return {"baoHanList":baoHanList,"otherList":otherList}
... prompt'''

总结:

总结嘛,就算了吧,就是最后一种最好最快,然后给出了优化的思路,并未提供代码,后续有空再填坑

字符串集合中相互包含关系算法相关推荐

  1. 【java集合框架源码剖析系列】java源码剖析之java集合中的折半插入排序算法

    注:关于排序算法,博主写过[数据结构排序算法系列]数据结构八大排序算法,基本上把所有的排序算法都详细的讲解过,而之所以单独将java集合中的排序算法拿出来讲解,是因为在阿里巴巴内推面试的时候面试官问过 ...

  2. c语言集合除去相同元素,使用C语言去掉字符串集合重复元素

    有一种最直接的方法可以去掉一个集合中重复的元素,这种方法据说就是"交给下面去做",然而有时候,你自己动手去做一下也是不错的.如果交给下面去做,最直接的选择就是使用map,在java ...

  3. java 循环list 对象_java计算list集合中重复对象的次数及for循环内外创建对象

    我的需求:计算字符串集合中"数值"出现的次数,然后在for循环中计算"数值"及出现的次数 解决方案: 1.使用collections类中的frequency(集 ...

  4. 【Kotlin】Kotlin 语言集合中的高阶函数详解 ( 数据类 data class | maxBy | minBy | filter | map | any | count | find )

    文章目录 I . List 集合高阶函数引入 II . Kotlin 数据类 ( data class ) III . Java 代码 与 Kotlin 代码实现对比 ( 查询年龄最大的 ) IV . ...

  5. java计算list集合中重复对象的次数及for循环内外创建对象

    2019独角兽企业重金招聘Python工程师标准>>> 我的需求:计算字符串集合中"数值"出现的次数,然后在for循环中计算"数值"及出现的次 ...

  6. 技术图文:集合技术在求解算法题中的应用

    背景 前段时间,在知识星球立了一个Flag,这是总结Leetcode刷题的第四篇图文. 理论部分 HashSet C# 语言中 HashSet<T> 是包含不重复项的无序列表,称为&quo ...

  7. 集合框架(去除ArrayList集合中的重复字符串元素案例2)

    package cn.itcast_04; import java.util.ArrayList; import java.util.Iterator; /* * 需求:ArrayList去除集合中字 ...

  8. python判断字符串里的字符_Python检测字符串中是否包含某字符集合中的字符

    目的 检测字符串中是否包含某字符集合中的字符 方法 最简洁的方法如下,清晰,通用,快速,适用于任何序列和容器 def containAny(seq,aset): for c in seq: if c ...

  9. 算法训练Day25 | LeetCode216. 组合总和III(和77.组合很像!);LeetCode17. 电话号码的字母组合(不同集合中组合)

    目录 LeetCode216. 组合总和III 1. 思路 2. 代码实现 3. 剪枝 4. 复杂度分析 5. 思考与收获 LeetCode17. 电话号码的字母组合 1. 思路 2. 代码实现 3. ...

最新文章

  1. matlab利用作图法求圆周率
  2. 做外贸如何获取同行的价格体系?转至【【Mr.Harris 原创】
  3. random---伪随机数生成器
  4. Python3 基础学习笔记 C05【字典】
  5. (软件工程复习核心重点)第六章实现和测试-第一节:编码
  6. 【育儿日记2】兔子不要上幼儿园
  7. 华为java面试题目,含面试题+答案
  8. php使用加密狗,加密狗使用方法
  9. 浏览器打开页面的几种方式
  10. [luogu4315] 月下“毛景树”
  11. Medical robotics-Regulatory, ethical, and legal considerations for increasing levels of autonomy
  12. java 导入excel 日期格式转换
  13. layui 自定义表格行高,自适应
  14. Python地学分析 — 建立矢量数据缓冲区 06
  15. 4.Python中的字符串整理总结
  16. 清理蓝藻的机器人_蓝藻打捞机 蓝藻打捞设备 蓝藻清除机 绿藻打捞设备 水华清除机...
  17. Day105 项目实战7 商品查询
  18. 2016蓝桥杯报纸页数(C++C组)
  19. 变频器LED显示灯闪烁_西门子S71200 PLC通过PROFINET,控制G120变频器的启停和输出频率...
  20. 四合天地软件测试系统,GZ-2017025软件测试赛题.-全国职业院校技能大赛.doc

热门文章

  1. 12306又崩溃,买张车票怎么就这么难
  2. vue通过for循环生成的checkbox点击一个选中全部的问题
  3. 如何恢复删除好友的微信聊天记录?iPhone手机高效操作方法
  4. springboot+vue+element-ui下载excel模板(静态文件)
  5. 亿万第一至二季/全集Billions迅雷下载
  6. HBase数据结构与基本语法详解
  7. 江苏警官学院计算机科学与技术专业,江苏警官学院什么专业好就业,哪些专业适合女生...
  8. 写字楼如何实现无线wifi短信验证登录?
  9. 基于SpringBoot+Vue打造实验报告提交审核系统
  10. 【数据库】数据库入门(二): 关系型数据库