减少使用Hashmap /其他方法多次操作字符串的运行时间

时间:2019-01-03 08:29:45

标签: java c multithreading

问题陈述是,我们有一个字符串,并且希望将每个字符旋转到下一个字符,即abbc和{{ 1}}至z。同样,转换基于数字x(x <=字符串大小)。数字代表要转换的字符的长度。假设数字为3,字符串为a,这意味着仅需要转换前3个字符,因此输出为stack。如果数字为5,则输出为tubck

我运行了tubdl次解决方案,并随机生成了变量100000000。我已经使用下面提到的3种方法解决了这个问题:

  1. 从字符转换为整数,然后将整数递增1,然后将整数转换回字符。
  2. 使用哈希图在O(1)时间内获取更新的字符值。
  3. 使用C,但所采用的方法与步骤1相同

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并行化并在更短的时间内解决?

2 个答案:

答案 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">