有效地构建具有给定汉明距离的单词图

2024-04-18

我想从单词列表中构建一个图表汉明距离 https://en.wikipedia.org/wiki/Hamming_distance(比如说)1,或者换句话说,如果两个单词仅与一个字母不同(lol


假设您将字典存储在set(), 以便查找是O(1)平均情况下(最坏情况O(n)) https://wiki.python.org/moin/TimeComplexity.

您可以从一个单词生成汉明距离为 1 处的所有有效单词:

>>> def neighbours(word):
...     for j in range(len(word)):
...         for d in string.ascii_lowercase:
...             word1 = ''.join(d if i==j else c for i,c in enumerate(word))
...             if word1 != word and word1 in words: yield word1
...
>>> {word: list(neighbours(word)) for word in words}
{'bot': ['lot'], 'lol': ['lot'], 'lot': ['bot', 'lol']}

If M是单词的长度,L字母表的长度(即 26),最坏的情况下使用这种方法查找邻近单词的时间复杂度是O(L*M*N).

“简单方法”方法的时间复杂度是O(N^2).

这种方法什么时候比较好?什么时候L*M < N,即如果仅考虑小写字母,则当M < N/26。 (我这里只考虑了最坏的情况)

Note: 英语单词的平均长度为 5.1 个字母 http://arxiv.org/pdf/1208.6109.pdf。因此,如果您的词典大小超过 132 个单词,您应该考虑这种方法。

也许可以实现比这更好的性能。然而,这实现起来非常简单。

实验基准:

“简单方法”算法(A1):

from itertools import zip_longest
def hammingdist(w1,w2): return sum(1 if c1!=c2 else 0 for c1,c2 in zip_longest(w1,w2))
def graph1(words): return {word: [n for n in words if hammingdist(word,n) == 1] for word in words}

该算法(A2):

def graph2(words): return {word: list(neighbours(word)) for word in words}

基准测试代码:

for dict_size in range(100,6000,100):
    words = set([''.join(random.choice(string.ascii_lowercase) for x in range(3)) for _ in range(dict_size)])
    t1 = Timer(lambda: graph1()).timeit(10)
    t2 = Timer(lambda: graph2()).timeit(10)
    print('%d,%f,%f' % (dict_size,t1,t2))

Output:

100,0.119276,0.136940
200,0.459325,0.233766
300,0.958735,0.325848
400,1.706914,0.446965
500,2.744136,0.545569
600,3.748029,0.682245
700,5.443656,0.773449
800,6.773326,0.874296
900,8.535195,0.996929
1000,10.445875,1.126241
1100,12.510936,1.179570
...

我用较小的 N 步长运行了另一个基准测试,以更接近地观察它:

10,0.002243,0.026343
20,0.010982,0.070572
30,0.023949,0.073169
40,0.035697,0.090908
50,0.057658,0.114725
60,0.079863,0.135462
70,0.107428,0.159410
80,0.142211,0.176512
90,0.182526,0.210243
100,0.217721,0.218544
110,0.268710,0.256711
120,0.334201,0.268040
130,0.383052,0.291999
140,0.427078,0.312975
150,0.501833,0.338531
160,0.637434,0.355136
170,0.635296,0.369626
180,0.698631,0.400146
190,0.904568,0.444710
200,1.024610,0.486549
210,1.008412,0.459280
220,1.056356,0.501408
...

您会看到权衡非常低(长度= 3 的单词词典为 100)。对于小字典,O(N^2) 算法执行slightly更好,但是随着 N 的增长,O(LMN) 算法很容易击败它。

对于具有较长单词的词典,O(LMN) 算法在 N 中保持线性,只是具有不同的斜率,因此权衡稍微向右移动(长度 = 5 时为 130)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有效地构建具有给定汉明距离的单词图 的相关文章

  • 在 pandas 中单独打印一列的原始值?

    我有一个数据框 df pd DataFrame name george age 23 name anna age 26 现在我想检索乔治的年龄 df df name george age 但这会输出一些额外的信息以及原始值 0 23 Nam
  • pandas Wide_to_long 后缀参数

    我对在 pandas 中使用 Wide to long 时的参数有疑问 有一个参数叫suffix我不明白 在文档中它说 后缀 str 默认 d 捕获所需后缀的正则表达式 d 捕获数字后缀 没有数字的后缀可以用否定字符类 D 指定 您还可以进
  • Python GTK + webkit - 在 gtk.main() 之后插入 JavaScript

    我在终端中尝试了这个 一切正常 但是如果我在脚本内运行这个 我无法在 gtk main 之后插入 JavaScript import gtk import webkit w gtk Window b webkit WebView w add
  • 以矢量化方式在另一个 DataFrame 中查找包含值子集的行

    如何匹配此 DataFrame 中的值source car id lat lon 0 100 10 0 15 0 1 100 12 0 10 0 2 100 09 0 08 0 3 110 23 0 12 0 4 110 18 0 32 0
  • Tipfy:如何在模板中显示blob?

    鉴于在 gae 上使用tipfy http www tipfy org python 以下模型 greeting avatar db Blob avatar 显示 blob 此处为图像 的模板标签是什么 在这种情况下 斑点是一个图像 这很棒
  • numpy:大量线段/点的快速规则间隔平均值

    我沿着一维线有许多 约 100 万个 不规则间隔的点 P 这些标记线段 这样 如果点是 0 x a x b x c x d 则线段从 0 gt x a x a gt x b x b gt x c x c gt x d 等 我还有每个段的 y
  • 张量流和线程

    下面是来自 Tensorflow 网站的简单 mnist 教程 即单层 softmax 我尝试通过多线程训练步骤对其进行扩展 from tensorflow examples tutorials mnist import input dat
  • 返回上个月的日期时间对象

    如果 timedelta 在它的构造函数中有一个月份参数就好了 那么最简单的方法是什么 EDIT 正如下面指出的那样 我并没有认真考虑这一点 我真正想要的是上个月的任何一天 因为最终我只会获取年份和月份 因此 给定一个日期时间对象 返回的最
  • 如何将类添加到 LinkML 中的 SchemaDefinition?

    中的图表https linkml io linkml model docs SchemaDefinition https linkml io linkml model docs SchemaDefinition and https link
  • PyArmor - 打包为一个可执行文件

    当我执行此命令时 您好 使用 PyArmor pyarmor pack main py 它将它打包到一个名为的文件夹中dist里面包含我的 exe 以及许多 Python 扩展文件 据我所知 PyArmor 使用 PyInstaller 来
  • 根据第三个变量更改散点图中的标记样式

    我正在处理多列字典 我想绘制两列 然后根据第三列和第四列更改标记的颜色和样式 我很难改变 pylab 散点图中的标记样式 我的方法适用于颜色 不幸的是不适用于标记样式 x 1 2 3 4 5 6 y 1 3 4 5 6 7 m k l l
  • Jupyter Notebook 中的深色模式绘图 - Python

    我正在使用 Jupyter Notebook 目前正在使用 JupyterThemes 的深色日光主题 我注意到我的绘图不是处于黑暗模式 并且文本仍然是黑色并且在日光照射的背景上无法读取 JupyterThemes 的自述文件建议在 ipy
  • 在seaborn中对箱线图x轴进行排序

    我的数据框round data看起来像这样 error username task path 0 0 02 n49vq14uhvy93i5uw33tf7s1ei07vngozrzlsr6q6cnh8w 39 png 1 0 10 n49vq
  • 如何使用 django-pyodbc (ubuntu 16.04) 配置数据库设置 Django-MSSQL?

    我是 Django 新手 目前正在尝试使用另一个数据库来保存我的模型 即MS SQL 我的数据库部署在docker容器中 903876e64b67 microsoft mssql server linux bin sh c opt mssq
  • 线性同余生成器 - 如何选择种子和统计检验

    我需要做一个线性同余生成器 它将成功通过所选的统计测试 我的问题是 如何正确选择发电机的数字以及 我应该选择哪些统计检验 我想 均匀性的卡方频率测试 每代收集10 000个号码的方法 将 0 1 细分为10个相等的细分 柯尔莫哥洛夫 斯米尔
  • 使用并集查找(又名不相交集)检测图是否是二分图

    我正在 Spoj 上做一个问题 基本上可以简化为检测图是否是二分图 我正在尝试使用 dfs 为图表着色 但它太慢了 有人评论这个 没有 bfs 没有 dfs 没有二部图 简单的并查集就可以做到 确实速度很快 提示 1 偶数长度的环不会影响两
  • 在Python中连续解析文件

    我正在编写一个脚本 该脚本使用 HTTP 流量行解析文件 并取出域 目前仅将它们打印到屏幕上 我正在使用 httpry 将流量连续写入文件 这是我用来删除域名的脚本 usr bin python import re input open r
  • python dicttoxml 多次使用相同的键

    我正在尝试做如下所示的 xml
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似
  • 在python中对列表列表执行行总和和列总和

    我想用python计算矩阵的行和和列和 但是 由于信息安全要求 我无法使用任何外部库 因此 为了创建矩阵 我使用了列表列表 如下所示 matrix 0 for x in range 5 for y in range 5 for pos in

随机推荐

  • 如何将两个数组合并为第三个数组? [复制]

    这个问题在这里已经有答案了 我有两个数组 array1 and array2 array1 a b c array2 1 2 3 我如何制作第三个数组 array3 array3 a b c 1 2 3 这个问题不同于在 for 循环的开头
  • 使用 openssl 生成自签名证书时如何设置密钥规范或 KEYEXCHANGE 属性

    我在 windows 2012R2 上使用 open ssl 来生成自签名证书 使用下面的命令我生成了证书 openssl genrsa des3 out ab key openssl req new x509 key ab key out
  • bcrypt 的 .net 实现

    有谁知道 bcrypt 的良好实现吗 我知道这个问题之前已经被问过 但得到的回应很少 我有点不确定是否要选择谷歌中出现的实现 并且我认为在 System Security Cryptography 命名空间中使用 sha256 可能会更好
  • C++ 中的异步线程安全日志记录

    我正在寻找一种在我的 C 项目中进行异步和线程安全日志记录的方法 如果可能的话 到一个文件 我目前正在使用cerr and clog对于任务 但由于它们是同步的 因此每次记录某些内容时执行都会短暂暂停 这是一个图形相对较多的应用程序 所以这
  • 美汤元素如何添加元素

    如果我有这样的 bs4 元素 它被称为tab window uls 1 ul li b Cut b Sits low on the waist li li b Fit b Skinny through the leg li li b Leg
  • 使用 C++ 删除文本文件中重复行的内存有效方法

    使用 C 删除大型文本文件中的重复行的最有效内存方法是什么 让我澄清一下 我不是要求代码 只是最好的方法 不保证重复的行是相邻的 我意识到针对最小内存使用进行优化的方法会导致速度变慢 但这是我的限制 因为文件太大 我会对每一行进行散列 然后
  • 如何在xamarin表单中使用单选按钮

    创建注册页面 我需要从用户那里获取以下数据 名 姓 Username Email Password 出生日期 Gender 用户角色 对于最后两个参数 我无法找到如何在 Xamarin Forms 中使用单选按钮 以下是我的注册页面代码
  • C#:具有构造函数的泛型类型?

    我有以下 C 测试代码 class MyItem MyItem int a class MyContainer lt T gt where T MyItem new public void CreateItem T oItem new T
  • 如何在 ngFor 循环中创建变量?

    我试图找出如何在ngFor loop 我有一个这样的循环 td a href getBuild branch prod url getBuild branch prod status a td 您可以看到getBuild必须重复多次调用 在
  • setContentView 执行期间黑屏

    我有一个MainActivity 有时 当它加载时 我会观察到黑屏一秒钟 我测量了操作的时间onCreate方法 发现花费了超过一秒的时间setContentView R layout main screen 我更喜欢显示上一个屏幕 在我的
  • 检测新的网络连接(linux-server)及其在java中的状态

    java 有什么方法可以检测到我刚刚插入有线网络 并监控它的带宽吗 我正在使用linux 如果这很重要的话 为了简单起见并且不使用本机代码 您可以尝试使用java net 网络接口 http java sun com javase 6 do
  • SpriteKit - 获取最近的节点

    有没有办法获得距离节点最近的节点 我正要编写一个方法来迭代所有节点并计算距离等 但想知道是否有更好的方法 我有 30 个节点 需要距离这 30 个节点中的每一个最近的 2 个节点 如果有意义的话 从 iOS 10 开始 您可以使用空间分区功
  • 在调用 f:ajax 侦听器之前和之后执行 JavaScript

    有一种简单的方法可以在调用之前和之后调用 JavaScript 操作
  • 扩展方法的空目标

    public static IFoo Bar
  • Linq to NHibernate 生成到同一个表的多个联接

    当我在 select 和 where 子句中引用同一个表时 linq to Nhibernate 会生成两个连接 一个用于 select 一个用于 where IE from child in Session Query
  • 比较 Django 中的日期和日期时间

    我有一个带有日期时间字段的模型 class MyModel models Model created models DateTimeField auto now True 我想获取今天创建的所有记录 我试过 MyModel objects
  • window.console 可以被覆盖吗?它是只读的吗?

    我用consolejavascript 中的对象用于调试 并希望覆盖它以便在移动浏览器中使用此类功能 但是 我无法理解以下 MDN 文档 Window console 只读属性返回对 Console 对象 提供将信息记录到控制台的方法 浏览
  • 如何通过 SystemJs 在 Angular2 中使用时刻时区

    我正在使用 Angular2 通过Angular2 种子 https github com mgechev angular2 seed 使用 SystemJS 并尝试加载时刻时区 http momentjs com timezone doc
  • 使用片段共享过渡时返回过渡无法正常工作

    我有2个碎片ListMovieFragment and DetailMovieFragment 我有一个界面ListMovieFragment是在MainActivity 我正在使用共享元素转换 当我单击图像视图时ListMovieFrag
  • 有效地构建具有给定汉明距离的单词图

    我想从单词列表中构建一个图表汉明距离 https en wikipedia org wiki Hamming distance 比如说 1 或者换句话说 如果两个单词仅与一个字母不同 lol 假设您将字典存储在set 以便查找是O 1 平均