【问题标题】:Change Hamming distance更改汉明距离
【发布时间】:2015-11-29 12:43:45
【问题描述】:

我想找到通过添加尽可能少的部分来改变带有二进制数的字符串之间的汉明距离的方法。我应该使用稀疏树和深度优先搜索,但我真的不知道如何使用它。

【问题讨论】:

  • 您能否添加您正在尝试构建的函数的预期输入和输出示例?并解释您实际尝试过的内容
  • 输入示例为 '1100010' ,'1001101', '1111111', '1111101', '1101001' 。我想将数字添加到汉明距离小于 x(som 整数)的字符串中。我想添加尽可能少的数字。
  • 使用Levenstein库计算汉明距离。文档:coli.uni-saarland.de/courses/LT1/2011/slides/… 然后在距离低于阈值并且字符相同时逐个字符地遍历字符串对,然后翻转一个字符串的位(1 到 0 或 0 到 1)并重新计算如果该对距离仍然很短,则增加与阈值的汉明距离并翻转更多字符。粘贴您的代码尝试,然后让它在那里形成。记住字符串是不可变的。

标签: python hamming-distance


【解决方案1】:

您可以使用此代码。如果是二进制字符串,它会计算列表中每对字符串之间的汉明距离。如果距离小于最小阈值,它只修改两个字符串之一,直到达到最小距离。这不太正确,因为修改一对字符串中的一个字符串会导致对一个字符串进行更多修改,因此更好的解决方案是修改一个字符串,然后再修改另一个字符串。但是,如果这看起来像您需要的那样,您可以修复它。

import Levenshtein as lv

min_distance = 3
numbers = {'1100010' ,'1001101', '1111111', '1111101', '1101001'}

for number in numbers:
    other_numbers = numbers - {number}
    for other_number in other_numbers:
        distance = lv.hamming(number, other_number)
        backup_other_number = other_number
        while lv.hamming(number, other_number) < min_distance:
            for count, (a, b) in enumerate(zip(number, other_number)):
                if a == b:
                    other_number = ''.join([
                        n if c != count else str(int(a != '1'))
                        for c, n in enumerate(other_number)
                    ])
                if lv.hamming(number, other_number) >= min_distance:
                    break
        print 'Old pair: {0}, distance: {1}'.format(
            (number, backup_other_number),
            distance
        )
        print 'New pair: {0}, distance: {1}'.format(
            (number, other_number),
            lv.hamming(number, other_number)
        )
    print '=' * 80

输出:

(tmp)➜  ~  python hamming.py
Old pair: ('1001101', '1111101'), distance: 2
New pair: ('1001101', '0111101'), distance: 3
Old pair: ('1001101', '1111111'), distance: 3
New pair: ('1001101', '1111111'), distance: 3
Old pair: ('1001101', '1100010'), distance: 5
New pair: ('1001101', '1100010'), distance: 5
Old pair: ('1001101', '1101001'), distance: 2
New pair: ('1001101', '0101001'), distance: 3
================================================================================
Old pair: ('1111101', '1001101'), distance: 2
New pair: ('1111101', '0001101'), distance: 3
Old pair: ('1111101', '1111111'), distance: 1
New pair: ('1111101', '0011111'), distance: 3
Old pair: ('1111101', '1100010'), distance: 5
New pair: ('1111101', '1100010'), distance: 5
Old pair: ('1111101', '1101001'), distance: 2
New pair: ('1111101', '0101001'), distance: 3
================================================================================
Old pair: ('1111111', '1001101'), distance: 3
New pair: ('1111111', '1001101'), distance: 3
Old pair: ('1111111', '1111101'), distance: 1
New pair: ('1111111', '0011101'), distance: 3
Old pair: ('1111111', '1100010'), distance: 4
New pair: ('1111111', '1100010'), distance: 4
Old pair: ('1111111', '1101001'), distance: 3
New pair: ('1111111', '1101001'), distance: 3
================================================================================
Old pair: ('1100010', '1001101'), distance: 5
New pair: ('1100010', '1001101'), distance: 5
Old pair: ('1100010', '1111101'), distance: 5
New pair: ('1100010', '1111101'), distance: 5
Old pair: ('1100010', '1111111'), distance: 4
New pair: ('1100010', '1111111'), distance: 4
Old pair: ('1100010', '1101001'), distance: 3
New pair: ('1100010', '1101001'), distance: 3
================================================================================
Old pair: ('1101001', '1001101'), distance: 2
New pair: ('1101001', '0001101'), distance: 3
Old pair: ('1101001', '1111101'), distance: 2
New pair: ('1101001', '0111101'), distance: 3
Old pair: ('1101001', '1111111'), distance: 3
New pair: ('1101001', '1111111'), distance: 3
Old pair: ('1101001', '1100010'), distance: 3
New pair: ('1101001', '1100010'), distance: 3
================================================================================
(tmp)➜  ~  
(tmp)➜  ~  python hamming.py
Old pair: ('1001101', '1111101'), distance: 2
New pair: ('1001101', '0111101'), distance: 3
Old pair: ('1001101', '1111111'), distance: 3
New pair: ('1001101', '1111111'), distance: 3
Old pair: ('1001101', '1100010'), distance: 5
New pair: ('1001101', '1100010'), distance: 5
Old pair: ('1001101', '1101001'), distance: 2
New pair: ('1001101', '0101001'), distance: 3
================================================================================
Old pair: ('1111101', '1001101'), distance: 2
New pair: ('1111101', '0001101'), distance: 3
Old pair: ('1111101', '1111111'), distance: 1
New pair: ('1111101', '0011111'), distance: 3
Old pair: ('1111101', '1100010'), distance: 5
New pair: ('1111101', '1100010'), distance: 5
Old pair: ('1111101', '1101001'), distance: 2
New pair: ('1111101', '0101001'), distance: 3
================================================================================
Old pair: ('1111111', '1001101'), distance: 3
New pair: ('1111111', '1001101'), distance: 3
Old pair: ('1111111', '1111101'), distance: 1
New pair: ('1111111', '0011101'), distance: 3
Old pair: ('1111111', '1100010'), distance: 4
New pair: ('1111111', '1100010'), distance: 4
Old pair: ('1111111', '1101001'), distance: 3
New pair: ('1111111', '1101001'), distance: 3
================================================================================
Old pair: ('1100010', '1001101'), distance: 5
New pair: ('1100010', '1001101'), distance: 5
Old pair: ('1100010', '1111101'), distance: 5
New pair: ('1100010', '1111101'), distance: 5
Old pair: ('1100010', '1111111'), distance: 4
New pair: ('1100010', '1111111'), distance: 4
Old pair: ('1100010', '1101001'), distance: 3
New pair: ('1100010', '1101001'), distance: 3
================================================================================
Old pair: ('1101001', '1001101'), distance: 2
New pair: ('1101001', '0001101'), distance: 3
Old pair: ('1101001', '1111101'), distance: 2
New pair: ('1101001', '0111101'), distance: 3
Old pair: ('1101001', '1111111'), distance: 3
New pair: ('1101001', '1111111'), distance: 3
Old pair: ('1101001', '1100010'), distance: 3
New pair: ('1101001', '1100010'), distance: 3
================================================================================

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-10
    • 2015-03-21
    • 2012-03-10
    • 2014-01-28
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 2016-12-16
    相关资源
    最近更新 更多