我已经在许多 不同的 语言中看到了 BK 树的许多不同实现,实际上它们似乎都没有包含从树中删除节点的方法。
即使最初介绍 BK 树的原始文章也没有提供关于节点删除的有意义的见解,因为作者只是建议标记要删除的节点,以便将其忽略:
删除结构1[BK树]和2中的键遵循与上述类似的过程,特别考虑要删除的键是代表x°[根键]的情况。在这种情况下,不能简单地删除密钥,因为它对于结构信息是必不可少的。相反,每个键必须使用一个额外的位来表示该键是否实际上对应于一条记录。相应地修改搜索算法以忽略与记录不对应的键。这涉及测试更新过程中的额外位。
虽然理论上可以正确删除 BK 树中的节点,但是否可以在线性/亚线性时间内这样做?
考虑以下示例:
def foo(iterator):
return sum(iterator) / max(iterator)
Run Code Online (Sandbox Code Playgroud)
重复使用同一个迭代器两次是否安全?
尝试使用参数在python 2.7中跨多行组合更长的SQL字符串,类似于:
duration_sql = "select MessageTime, " + \
"Value from [%s] " + \
"where Subsystem=%s and " + \
"Field=%s " + \
"and MessageTime > %s and " + \
"MessageTime < %s" % (i, j, k, l, m)
Run Code Online (Sandbox Code Playgroud)
但我得到一个运行时错误:
TypeError: not all arguments converted during string formatting
Run Code Online (Sandbox Code Playgroud)
如果我允许它是一个没有换行符的长字符串,它可以正常工作.我有什么方法可以打破带参数的行的长字符串?无法弄清楚秘密酱......
假设我们有以下虚拟函数:
import sys
def writeline(text, stream=sys.stdout):
stream.write(text + '\n')
with open('/path/to/file', 'w') as f:
# writes to /path/to/file
writeline('foo', f)
# writes to standard output
writeline('bar')
Run Code Online (Sandbox Code Playgroud)
鉴于 Python 在定义时计算函数的默认参数,设置sys.stdout为默认参数是否安全,或者可能会产生意想不到的副作用?
python ×3
algorithm ×1
bk-tree ×1
iterator ×1
python-2.7 ×1
python-3.x ×1
stdout ×1
sys ×1
tree ×1