【问题标题】:Using integers to encode short strings使用整数对短字符串进行编码
【发布时间】:2021-01-08 07:06:54
【问题描述】:

假设我仅限于使用 32 位无符号整数来表示字符串。显然,我可以使用单独的 u8 数字并分配足够的单独值来描述一个短字符串,但是说计算和时间并不重要,这是出于我的好奇心,不一定是为了实际使用。

我观察到 32 位数字与 4 个严格的 u8 字符大小相同。在十进制中,任何字符编码中的 4 个可以被 2 位十进制索引为它们的十进制等效值,而 5 个 ECMA-1 字符可以适合相同的位大小。

假设我想要可打印字符的范围,使用映射的 ASCII 表,我减去 32 以将可打印字符转换为 2 个十进制数字(32 到 126 变成 0 到 94)。假设一个类似于|c,i|c-31*(10^((i+1)*2))的映射函数,其中c是ASCII值,i是位置:45769502。在ASCII值中作为u8数组[66, 97, 116, 33] 或字符串“Bat!”

显然这在计算上效率不高。我不一定要为此拍摄?这里只是纯粹的好奇。

假设计算是任意的,所以即使完全荒谬,我如何将更长的字符串编码为 32 位无符号整数?

【问题讨论】:

    标签: algorithm encoding compression


    【解决方案1】:

    首先,您需要决定要编码的字符。假设您选择了 k 字符,这些字符已映射到数字 0 到 k-1。然后每个整数 n 通过在基数 k 中表达 n 并将每个 k-ary 数字映射到相应的字符来映射到一个唯一的非空字符串。您可以为空字符串保留最大整数。

    所以你只需要一个k 字符的映射表和一个function to convert 一个从一个基到另一个基的整数,这既简单又高效,而且编码也是最佳密集的(因为每个整数都映射到一个唯一的字符串)。

    【讨论】:

    • 今天下午我又在想它,我意识到我正在以一种最低效的方式隐含地做这件事。本质上,我观察到可以将符号的 base-100 映射编码到 int 上。我的方法是首先从 base-2 转换为 base-10,然后使用两位数的 base-10 表示——实际上是 base-100,即长期循环。看起来 base-73 是我能在 32 位空间中获得的最密集的表达,5 个字符编码在一个合理的符号集中。我想通过状态机语义,我可以更具表现力......但是,eww。
    猜你喜欢
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多