问题陈述是,我们有一个字符串,并且希望将每个字符旋转到下一个字符,即a
至b
,b
至c
和{{ 1}}至z
。同样,转换基于数字x(x <=字符串大小)。数字代表要转换的字符的长度。假设数字为3,字符串为a
,这意味着仅需要转换前3个字符,因此输出为stack
。如果数字为5,则输出为tubck
。
我运行了tubdl
次解决方案,并随机生成了变量100000000
。我已经使用下面提到的3种方法解决了这个问题:
hashmap技术(方法2)的运行时间将越来越多。我不知道为什么?
方法1是
number
使用哈希图的方法2是
public static void main(String[] args) {
Long startTime = System.currentTimeMillis();
String name = "abcdefghijklmnopqrstuvwxyz";
char[] stringCharArray = name.toCharArray();
Random random = new Random();
for (Integer i = 0; i <100000000; i++) {
{
for (int j = 0; j < random.nextInt(26) + 1; j++) {
if (stringCharArray[j] == 'z') {
stringCharArray[j] = 'a';
} else {
stringCharArray[j] = (char) (((int) (stringCharArray[j])) + 1);
}
}
}
}
Long endtime = System.currentTimeMillis();
System.out.println(endtime-startTime+" ms");
}
方法3
public static void main(String[] args) {
HashMap hashMap = new HashMap();
hashMap.put('a', 'b');
hashMap.put('b', 'c');
hashMap.put('c', 'd');
hashMap.put('d', 'e');
hashMap.put('e', 'f');
hashMap.put('f', 'g');
hashMap.put('g', 'h');
hashMap.put('h', 'i');
hashMap.put('i', 'j');
hashMap.put('j', 'k');
hashMap.put('k', 'l');
hashMap.put('l', 'm');
hashMap.put('m', 'n');
hashMap.put('n', 'o');
hashMap.put('o', 'p');
hashMap.put('p', 'q');
hashMap.put('q', 'r');
hashMap.put('r', 's');
hashMap.put('s', 't');
hashMap.put('t', 'u');
hashMap.put('u', 'v');
hashMap.put('v', 'w');
hashMap.put('w', 'x');
hashMap.put('x', 'y');
hashMap.put('y', 'z');
hashMap.put('z', 'a');
Long startTime = System.currentTimeMillis();
String name = "abcdefghijklmnopqrstuvwxyz";
char[] stringCharArray = name.toCharArray();
Random random = new Random();
for (Integer i = 0; i <100000000; i++) {
{
for (Integer j = 0; j < random.nextInt(26) + 1; j++) {
stringCharArray[j] = (char) hashMap.get(stringCharArray[j]);
}
}
}
Long endtime = System.currentTimeMillis();
System.out.println(endtime-startTime+" ms");
}
方法1的运行时间约为8150 m,方法2的约为9700 ms,方法3的约为5400 ms。我正在使用MacBook Pro 2.3 GHz Intel Core i5和8 GB 2133 MHz LPDDR3。
如何减少运行时间,我在Java中使用#include <stdio.h>
#include <time.h>
#include <zconf.h>
#include <stdlib.h>
int main() {
long start = clock();
char name[] = "abcdefghijklmnopqrstuvwxyz";
for (int i = 0; i <100000000; i++) {
{
for (int j = 0; j < rand() % 25; j++) {
if (name[j] == 'z') {
name[j] = 'a';
} else {
name[j] = (char) (((int) (name[j])) + 1);
}
}
}
}
long stop = clock();
printf("time taken = %ld sec \n",( stop-start)/1000);
}
对apprach#2进行了更改,但是运行时间却在增加。我在做什么错了?
目标是使运行时少于方法3。 C中是否可以使用pthreads并行化并在更短的时间内解决?
答案 0 :(得分:1)
定义一个字符数组,如
char[] nextChar = {'b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','a'};
然后您可以通过直接访问相同的索引或字符的ASCII差异来获得下一个
stringCharArray[j] = nextChar[j];//by index
stringCharArray[j] = nextChar[stringCharArray[j]-'a'];// using ascii
下面是完整的代码
Long startTime = System.currentTimeMillis();
char[] nextChar = {'b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','a'};
String name = "abcdefghijklmnopqrstuvwxyz";
char[] stringCharArray = name.toCharArray();
Random random = new Random();
for (int i = 0; i <100000000; i++) {
{
for (int j = 0; j < random.nextInt(27); j++) {
stringCharArray[j] = nextChar[j];//by index
//stringCharArray[j] = nextChar[stringCharArray[j]-'a'];// using ascii
}
}
}
Long endtime = System.currentTimeMillis();
System.out.println(endtime-startTime+" ms");
答案 1 :(得分:1)
这是一个比我的C示例在我的PC上快8倍的版本。
<p class="main-menu">
<a href="studenthome.html" class="linking">
ΦΟΙΤΗΤΕΣ
</a>
<a href="secrethome.html" class="linking">
ΓΡΑΜΜΑΤΕΙΑ
</a>
<a href="publisherhome.html" class="linking">
ΕΚΔΟΤΗΣ
</a>
<a href="sellerhome.html" class="linking">