我接受了一些课程来实现我选择的压缩算法。它可以是任何语言,但是我最了解的语言是 Java,其次是 C。它将基于 -
解压后的输出必须与原始输入匹配,所以我只能看损失较小的算法。
运行时间必须与消息的长度成正比。
内存要求必须与消息的长度无关。
我们的实施将进行如下测试 -
标准文本文件
字节值范围为 0-255 的二进制文件
一个大约 10mb 的大文件,其中包含未指定的内容。
我最初的想法是使用动态算术编码,但我想知道是否有更适合上述约束的算法?其次,用 C 语言比用 Java 语言更好吗?我问这个问题是因为我认为 C 的内存占用较小,但我不确定是否确实如此。
我花了一些时间谷歌搜索这个问题,一些网站提到了 LZW 编码与动态霍夫曼编码相结合。这是一个明智的追求途径吗?我们的讲师确实警告我们,多年来尝试动态霍夫曼编码的提交内容中有 90% 没有得到正确实现。
也就是说,我并不害怕尝试一下,但在开始之前我会重视一些意见。
任何反馈将不胜感激。
我正在做一些课程,我们已经看到了以下代码.一些问题询问代码的各个行是什么,这很好,我理解,但曲线球是"这个程序包含竞争条件.它出现在哪里以及为什么出现?"
代码:
#include <stdio.h>
#include <signal.h>
static void handler(int signo) {
printf("This is the SIGUSR1 signal handler!\n");
}
int main(void) {
sigset_t set;
sigemptyset(&set);
sigset(SIGUSR1, handler);
sigprocmask(SIG_SETMASK, &set, NULL);
while(1) {
printf("This is main()!\n");
}
return 0;
Run Code Online (Sandbox Code Playgroud)
}
我在想,竞争条件是没有办法知道什么顺序"这是主要的"或"这是SIGUSR1"将在信号到达时打印,但如果有人可以确认或澄清这一点我我非常感激.他还询问如何修复(比赛条件),不寻找完整的答案,但任何提示将不胜感激.
我在这里或一般在Web上找不到关于Java的有用答案。这个问题看似很简单-我需要一种计算任意大小的字节数组中包含的位数的方法。字节数组可以容纳十六进制,十进制或二进制值。
我确信这是我看到答案时会踢自己的那些问题之一,但事实证明,这令人非常沮丧。该方法应类似于:
public int bitsInByteArray(byte[] b) {
return - sum of bit count (ie the sum total bits, not the sum of their values)
of each byte in b
}
Run Code Online (Sandbox Code Playgroud)
任何方向或建议将不胜感激。
编辑-抱歉,我根本没说这句话。我正在做一个加密分配,并且被要求“使用AES用密钥k加密包含64个零位的单个块”现在,我创建了byte [] zeroBlockAes = {0x0,0x0 ... 0x0},直到包含64个零元素。问题是,这肯定是512位吗?那我应该只输入八个零值吗?
执行此操作时,我的加密输出为-75 111 69 107 -18 88 51 89 68 -123 -49 18 -26 -109 94 21
当我再次解密时,我得到了原始的八个零。在AES中这是正常现象还是我可能做错了什么,我认为分组密码为加密和解密产生了相同大小的输入/输出。
我设法得到一个Eulers Totient Function的版本,虽然它适用于较小的数字(这里较小的数字比我需要它计算的1024位数字更小)
我的版本在这里 -
public static BigInteger eulerTotientBigInt(BigInteger calculate) {
BigInteger count = new BigInteger("0");
for(BigInteger i = new BigInteger("1"); i.compareTo(calculate) < 0; i = i.add(BigInteger.ONE)) {
BigInteger check = GCD(calculate,i);
if(check.compareTo(BigInteger.ONE)==0) {//coprime
count = count.add(BigInteger.ONE);
}
}
return count;
}
Run Code Online (Sandbox Code Playgroud)
虽然这适用于较小的数字,但它的工作原理是迭代从1到计算的数字.对于大型BigIntegers,这是完全不可行的.
我已经读过,每次迭代都可以划分数字,无需逐个查看.我只是不确定我应该用什么来划分(我在C中看到的一些例子是使用long和一个平方根 - 据我所知我无法准确准确地准确BigInteger的平方根.我也想知道如果对于像这样的模运算,函数是否需要包含一个说明mod是什么的参数.我完全不确定,所以任何建议都非常赞赏.
任何人都能指出我在正确的方向吗?
PS当我发现修改Euler Totient功能时,我删除了这个问题.我改编它与BigIntegers合作 -
public static BigInteger etfBig(BigInteger n) {
BigInteger result = n;
BigInteger i;
for(i = new BigInteger("2"); (i.multiply(i)).compareTo(n) <= 0; i = i.add(BigInteger.ONE)) {
if((n.mod(i)).compareTo(BigInteger.ZERO) == 0)
result = …Run Code Online (Sandbox Code Playgroud) java optimization cryptography public-key-encryption factorization
我正在codeeval.com上处理一个问题 - http://codeeval.com/open_challenges/17/."编写一个程序来确定列表中连续整数的最大总和".
输入是一个文本文件,包含逗号分隔的整数列表,每行一个例如
-10,2,3,-2,0,5,-15
2,3,-2,-1,10
该输入应该为第一行产生8,为第二行产生12.我的答案如下,但我看不出第二行如何获得12,所以我的问题主要是我错过了什么,我是否误解了所要求的内容?(答案是13分)
NB - 我住在爱尔兰所以这纯粹是出于我自己的经验,你不会帮我申请工作!另外,我在这里经历了每个类似的问题,但找不到任何相关的问题.
如果我对这个问题的解释是不正确的,那么我所需要的只是一个正确的方向,而不一定是代码.(如有,有人可以指出第二行如何评估为12而不是13)
import java.util.*;
import java.io.*;
public class largest_sum {
public static void main(String[] args) throws Exception {
FileReader input = new FileReader(args[0]);
BufferedReader bufRead = new BufferedReader(input);
String line;
line = bufRead.readLine();
while(line != null) {
addInts(line);
line = bufRead.readLine();
}
bufRead.close();
System.exit(0);
}
public static void addInts(String line) {
String[] numbers = line.split(",");
Integer largest = Integer.parseInt(numbers[0].trim());
Integer secondLargest = 0;
for(String s : numbers) {
Integer converted …Run Code Online (Sandbox Code Playgroud) java ×3
arrays ×2
c ×2
byte ×1
compression ×1
cryptography ×1
encoding ×1
linux ×1
optimization ×1
signals ×1