如何通过将非数字字符串转换为整数来对它们进行排序?有没有办法在订购时将字符串转换为唯一的整数?
How to sort non-numeric strings by converting them to integers? Is there a way to convert strings to unique integers while being ordered?
我正在尝试将字符串转换为整数并根据整数值对它们进行排序。这些值对于字符串应该是唯一的,没有其他字符串应该能够产生相同的值。如果 string1 大于 string2,则它的整数值应该更大。例如:因为“orange”>“apple”,“orange”应该有一个更大的整数值。我该怎么做?
我知道 'a' 和 'b' 之间有无数种可能性,但我并不想将每一种可能性都归入一个数字。我只是想尽可能地排序,比如 100 万个值,而不是无限量。
我能够使用以下方法获得唯一的值:
long int order = 0;
for (auto letter : word)
order = order * 26 + letter - 'a' + 1;
return order;
但这显然不起作用,因为“apple”的值将大于“z”的值。
这不是作业或拼图,这是我自己想到的。感谢您的帮助,谢谢!
您可以使用字符的位置:
std::string s("apple");
int result = 0;
for (size_t i = 0; i < s.size(); ++i)
result += (s[i] - 'a') * static_cast<int>(i + 1);
return result;
顺便说一下,您正在尝试获得与哈希函数非常相似的东西。
您快完成了...只需要进行一些小的调整:
你乘以 26
但是你有字母 (a..z)
和空 space 所以你应该乘以 27 !!!
添加零填充
为了使起始字母成为最重要的数字,您应该 zeropad/align 字符串的共同长度...如果您使用 32 位整数,则字符串的最大大小为:
floor(log27(2^32)) = 6
floor(32/log2(27)) = 6
这里是小例子:
int lexhash(char *s)
{
int i,h;
for (h=0,i=0;i<6;i++) // process string
{
if (s[i]==0) break;
h*=27;
h+=s[i]-'a'+1;
}
for (;i<6;i++) h*=27; // zeropad missing letters
return h;
}
返回这些:
14348907 a
28697814 b
43046721 c
373071582 z
15470838 abc
358171551 xyz
23175774 apple
224829626 orange
按哈希排序:
14348907 a
15470838 abc
23175774 apple
28697814 b
43046721 c
224829626 orange
358171551 xyz
373071582 z
这将处理所有长度不超过 6 个字符的小写 a..z
字符串,即:
26^6 + 26^5 +26^4 + 26^3 + 26^2 + 26^1 = 321272406 possibilities
对于更多,只需为散列使用更大的位宽。如果您也使用它的最高位,请不要忘记使用无符号类型(32 位不是这种情况)
我正在尝试将字符串转换为整数并根据整数值对它们进行排序。这些值对于字符串应该是唯一的,没有其他字符串应该能够产生相同的值。如果 string1 大于 string2,则它的整数值应该更大。例如:因为“orange”>“apple”,“orange”应该有一个更大的整数值。我该怎么做?
我知道 'a' 和 'b' 之间有无数种可能性,但我并不想将每一种可能性都归入一个数字。我只是想尽可能地排序,比如 100 万个值,而不是无限量。
我能够使用以下方法获得唯一的值:
long int order = 0;
for (auto letter : word)
order = order * 26 + letter - 'a' + 1;
return order;
但这显然不起作用,因为“apple”的值将大于“z”的值。
这不是作业或拼图,这是我自己想到的。感谢您的帮助,谢谢!
您可以使用字符的位置:
std::string s("apple");
int result = 0;
for (size_t i = 0; i < s.size(); ++i)
result += (s[i] - 'a') * static_cast<int>(i + 1);
return result;
顺便说一下,您正在尝试获得与哈希函数非常相似的东西。
您快完成了...只需要进行一些小的调整:
你乘以 26
但是你有字母
(a..z)
和空 space 所以你应该乘以 27 !!!添加零填充
为了使起始字母成为最重要的数字,您应该 zeropad/align 字符串的共同长度...如果您使用 32 位整数,则字符串的最大大小为:
floor(log27(2^32)) = 6 floor(32/log2(27)) = 6
这里是小例子:
int lexhash(char *s)
{
int i,h;
for (h=0,i=0;i<6;i++) // process string
{
if (s[i]==0) break;
h*=27;
h+=s[i]-'a'+1;
}
for (;i<6;i++) h*=27; // zeropad missing letters
return h;
}
返回这些:
14348907 a
28697814 b
43046721 c
373071582 z
15470838 abc
358171551 xyz
23175774 apple
224829626 orange
按哈希排序:
14348907 a
15470838 abc
23175774 apple
28697814 b
43046721 c
224829626 orange
358171551 xyz
373071582 z
这将处理所有长度不超过 6 个字符的小写 a..z
字符串,即:
26^6 + 26^5 +26^4 + 26^3 + 26^2 + 26^1 = 321272406 possibilities
对于更多,只需为散列使用更大的位宽。如果您也使用它的最高位,请不要忘记使用无符号类型(32 位不是这种情况)