Algorithm 如果对唯一的字符串使用简单的替换算法,输出是否总是唯一的?
这有点像散列,但更简单。比如:Algorithm 如果对唯一的字符串使用简单的替换算法,输出是否总是唯一的?,algorithm,hash,Algorithm,Hash,这有点像散列,但更简单。比如: function getUniqueId(input) { var map = { A: 'Q', B: 'W', C: 'E', D: 'R', E: 'T', F: 'Y', G: 'U', H: 'I', I: 'O', J: 'P', K: 'A', L: 'S', M: 'D', N: 'F', O: 'G',
function getUniqueId(input) {
var map = {
A: 'Q', B: 'W', C: 'E',
D: 'R', E: 'T', F: 'Y',
G: 'U', H: 'I', I: 'O',
J: 'P', K: 'A', L: 'S',
M: 'D', N: 'F', O: 'G',
P: 'H', Q: 'J', R: 'K',
S: 'L', T: 'Z', U: 'X',
V: 'C', W: 'V', X: 'B',
Y: 'N', Z: 'M',
a: 'q', b: 'w', c: 'e',
d: 'r', e: 't', f: 'y',
g: 'u', h: 'i', i: 'o',
j: 'p', k: 'a', l: 's',
m: 'd', n: 'f', o: 'g',
p: 'h', q: 'j', r: 'k',
s: 'l', t: 'z', u: 'x',
v: 'c', w: 'v', x: 'b',
y: 'n', z: 'm',
0: '3', 1: '4', 2: '5',
3: '6', 4: '7', 5: '8',
6: '9', 7: '0', 8: '1',
9: '2',
},
output = "";
for (var i = 0; i < input.length; i++) {
if (map[input[i]] !== undefined){
output += map[input[i]];
}
}
return output;
}
函数getUniqueId(输入){
变量映射={
A:‘Q’,B:‘W’,C:‘E’,
D:'R',E:'T',F:'Y',
G:'U',H:'I',I:'O',
J:'P',K:'A',L:'S',
M:D',N:F',O:G',
P:H',Q:J',R:K',
S:'L',T:'Z',U:'X',
V:C',W:V',X:B',
Y:'N',Z:'M',
a:‘q’,b:‘w’,c:‘e’,
d:'r',e:'t',f:'y',
g:'u',h:'i',i:'o',
j:'p',k:'a',l:'s',
m:d',n:f',o:g',
p:h',q:j',r:k',
s:'l',t:'z',u:'x',
v:c',w:v',x:b',
y:'n',z:'m',
0: '3', 1: '4', 2: '5',
3: '6', 4: '7', 5: '8',
6: '9', 7: '0', 8: '1',
9: '2',
},
输出=”;
对于(变量i=0;i假设输入字符串总是唯一的,那么输出字符串是否也总是唯一的?如果哈希是通过对字符串中唯一的每个字符应用相同的替换函数来创建的,则可以确保仅当替换函数是唯一的时,输出字符串才会始终唯一。 此属性保留了显著性,这是防止唯一性所需的 要检查此属性,需要证明:
a≠ b、 然后f(a)≠ f(b)
。对于您的地图-对于数字来说,这是显而易见的,对于字母来说,这可能会令人困惑,但可以使用简单的bash脚本进行检查,该脚本收集所有目标值,以查看是否两次都没有目标值:
echo "A: Q, B: W, C: E, D: R, E: T, F: Y, G: U, H: I, I: O, J: P, G, P: H, Q: J, R: K, S: L, T: Z, U: X, V: C, W: V, X: B, Y: N, Z: M" | tr ',' '\n' | cut -d':' -f2 | sort | tr -d ' \n'
它确实输出
ABCDEFGHIJKLMNOPQRSTUVWXYZ
因为您的函数不会更改字符的位置,并且每个字符都要经过这种一对一的映射,所以唯一的输入将始终生成唯一的输出
当然,只有当您确定输入字符串位于域A-Z、A-Z、0-9中时,这才是正确的,否则它将无法工作(
“@A”=>“Q”
,“A”=>“Q”
)。我想这取决于您如何定义“简单替换”
如果您严格地将“substitutea
与emen
(以及其他内容)一起应用,则将此替换(我称之为“简单”,但不为“可逆”)应用于字符串“cat”和“cement”的结果都以reult“cement”结尾
编辑:您只有单字母替换,所以“所有”您需要确保的是没有两个(或更多)“源字符”映射到的“目标字符”
最简单的方法可能是生成一个字符串,该字符串包含所有可能的可映射字符(因此,大写和小写字母以及所有数字),并按您喜欢的排序顺序排列(按ASCII值排序可能是最简单的)。然后生成编码版本,对其进行排序并进行比较
由于您映射的是所有源字符,并且您有一个仅由目标字符组成的字符串,如果它们的排序版本相同,则不会有任何重复,因此您可以保证两个不同的字符串也具有不同的编码形式。替换函数如何工作<代码>e在
嘿
变成s
,但是e
在那里
变成x
?这是我的错误。谢谢,应该是x。我以前犯过一个错误,第一个e应该是x。不过谢谢,我得到了答案,它将是唯一的。我添加了算法。@TahmidKhanNafee我编辑了答案以考虑您的编辑,证明的方法应该是直接的嘿,我添加了替换函数。你能检查一下吗?原则上是的。然而,我更喜欢编辑我的答案,以展示你自己如何做到这一点。