gpt4 book ai didi

java - 在编码之前/之后获取/应用大写掩码?

转载 作者:太空宇宙 更新时间:2023-11-04 07:52:56 24 4
gpt4 key购买 nike

我的项目采用String s并将所有小写版本s.toLowerCase()传递给无损编码器。
我可以很好地转换小写字符串的编码/解码,但这显然不切实际,因此我需要能够以某种方式保留原始String的大写形式。

我正在考虑使用Character.isUpperCase()来获取整数UpperCaseLetters[]的数组,该数组表示s中所有大写字母的位置。然后,我将使用此数组将^放置在编码字符串中的所有位置UpperCaseLettes[i] + 1。解码字符串时,我会知道^之前的每个字符都是大写字母。 (顺便说一句,此编码器在编码时将永远不会生成^)。

不过这种方法对我来说似乎很草率。我还考虑使用位字符串表示大小写,但是应用程序的总体目标是压缩,因此效率不高。

有没有更简单的方法来获取和应用字符串的大写掩码?如果有,它将需要多少“存储”?

最佳答案

您的选择:

自动大写:

使用大写的通用算法,使用以下技术之一仅记录生成的字母和实际大写字母之间的字母不同。要重新生成,只需再次运行算法并翻转所有记录字母的大小写即可。假设应该有大写字母(例如句子开头),这将使算法稍微变慢(仅减小一个较小的常数n,并且体面的压缩通常要慢得多),并且总是减少存储量所需空间很少。

资本头寸位图:

您已经介绍了这一点,效率不是很高。

具有识别字符的前缀大写:

也已经介绍过了,除了您描述了后缀,但前缀通常更好,对于更通用的解决方案,您还可以使用^转义^^。不错的主意。根据压缩情况,最好改用已出现在数据集中的字母。最常见或最不常见的字母,或者您可能必须查看压缩算法并进行大量处理才能确定要使用的理想字母。

以任何格式存储起始资金的距离:

与下一个首都的距离(下)没有优势。

到下一个大写字母的距离-非位串表示:

通常,效率不如使用位串。

位串=到下一个大写字母的距离:

您有一系列长度,每个长度依次指示大写字母之间的距离。因此,如果有距离,则0,3,1,0,5大写形式如下:AbcdEfGHijklmNo(将0个字符跳到第一个,将3个字符跳到第二个,将1个字符跳到第3个,依此类推)。有一些选项可以存储此:


固定长度:这不是一个好主意,因为它需要=尽可能长的距离。一个明显的替代方法是在下一个长度中进行某种程度的溢出,但这仍然占用过多空间。
固定长度,不同的设置:用一个例子最好地解释-前4位表示长度,00表示后面有2位表示距离,01表示4位,10表示8位,11表示16位,如果有可能超过16位,则可能需要执行以下操作-110表示16位,1110表示32位,11110表示64-位等(听起来可能类似于确定IPv4地址的类别)。因此,0001010100会分为00-0101-0100,因此距离为1、4。请注意,长度不必以2的幂为单位递增。16位= 65535个字符是很多,并且2位= 3很少,您可以将其设置为4、6、8,(16?),(32?),??? (除非连续有几个大写字母,否则您可能还需要2位)。
使用转义序列可变长度:假设转义序列为00,我们要使用不包含00的所有字符串,因此位值表如下所示:

Bits Value
1 1
10 2
11 3
101 4 // skipped 100
110 5
111 6
1010 7 // skipped 1000 and 1001


10100101010010101000101000010将分为 10110101101010101,0, 10。请注意, ...1001..只会导致在左边1处结束的拆分,而右边的1处开始的拆分,而 ...10001...会导致在第一个0处结束的拆分并且从右边1处开始的拆分,并且 ...100001...表示a两者之间为0值的距离。伪代码类似于:

if (current value == 1 && zeroCount < 2)
add to current split
zeroCount = 0
else if (current value == 1) // after 00...
if (zeroCount % 2 == 1) { add zero to current split; zeroCount--; }
record current split, clear current split
while (zeroCount > 2) { record 0-distance split; zeroCount -= 2; }
else zeroCount++


对于短距离来说,这似乎是一个很好的解决方案,但是一旦距离变大,我怀疑您会跳过太多的值,并且长度会迅速增加。


没有理想的解决方案,它很大程度上取决于数据,您必须使用前缀大写字母和位串距离的不同选项,才能找到最适合您的典型数据集的方法。

关于java - 在编码之前/之后获取/应用大写掩码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14118316/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com