Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:第一个非重复字符,使用哈希映射的O(n)时间_C++_String_Algorithm_Hash_Hashmap - Fatal编程技术网

C++ C++;:第一个非重复字符,使用哈希映射的O(n)时间

C++ C++;:第一个非重复字符,使用哈希映射的O(n)时间,c++,string,algorithm,hash,hashmap,C++,String,Algorithm,Hash,Hashmap,我试图编写一个函数来获取字符串的第一个非重复字符。我还没有找到一个令人满意的答案,关于如何在O(n)时间内为所有情况做到这一点。我目前的解决办法是: char getFirstNonRepeated(char * str) { if (strlen(str) > 0) { int visitedArray[256] = {}; // Where 256 is the size of the alphabet for (int i = 0; i

我试图编写一个函数来获取字符串的第一个非重复字符。我还没有找到一个令人满意的答案,关于如何在O(n)时间内为所有情况做到这一点。我目前的解决办法是:

char getFirstNonRepeated(char * str) {
    if (strlen(str) > 0) {
        int visitedArray[256] = {};    // Where 256 is the size of the alphabet
        for (int i = 0; i < strlen(str); i++) {
            visitedArray[str[i]] += 1;
        }

        for (int j = 0; j < 256; j++) {
            if (visitedArray[j] == 1) return j;
        }

    }
    return '\0';    // Either strlen == 0 or all characters are repeated
}
char getFirstNonRepeated(char*str){
如果(strlen(str)>0){
int visitedArray[256]={};//其中256是字母表的大小
对于(int i=0;i

然而,只要n<256,在最坏的情况下,该算法在O(n^2)时间内运行。我读过,使用哈希表而不是数组来存储每个字符的访问次数可以使算法在O(n)时间内一致运行,因为哈希表上的插入、删除和搜索在O(1)时间内运行。我还没有找到一个问题来解释如何正确地做到这一点。我在C++中没有太多的使用哈希地图的经验,所以任何帮助都会被理解。p> 为什么要在每个循环中重复对strlen()的调用?这和字符串的长度是线性的,所以第一个循环实际上变成了O(n^2),这根本没有什么好的理由。只需计算一次长度并存储它,或者使用str[i]作为结束条件


您还应该注意,如果编译器使用有符号字符,则任何大于127的字符值都将被视为负数(并用作负数,即超出边界的数组偏移量)。可以通过将字符值显式转换为无符号字符来避免这种情况

好的,O(N^2)来自strlen,但你甚至不需要它。我认为这甚至不能满足你的要求。例如,如果i/p是
“dac”
,则o/p应该是
d
,而不是
a
(如果我理解正确),但您的代码将是o/p
a
o表示法是关于渐近极限的。说“只要n<256,这个算法就在O(…)中运行”是没有意义的,因为如果
n
被限制在某个常数
k
的可能性内,并且该算法在
n
的每一个值处终止,那么根据定义,该算法在
O(1)
中运行。(有一些常量
c
,它是
n
的任何合法值的最长时间)我甚至没有想到strlen()调用。我创建了一个变量来存储长度,只是用它来代替。那么这个实现是否足够接近O(n)?没有办法改进它吗?嗯,除了strlen()调用之外,您的函数已经是O(n)。只有strlen把它推到O(n^2)。好的。我想当时我只是有点困惑。我认为如果n<256,那么你迭代这个列表,然后迭代另一个同样大或更大的列表,所以它会把它推过O(n)。我不确定这是否是一个问题,或者是否有一种更为优化的方法。你可能过于关注O符号了。正式的第一个循环(去掉strlen)是O(n)。第二个循环是O(1),它不依赖于要开始的输入的长度。它们一起是O(n)。如果第二个循环也是O(n),那么两个循环加在一起仍然是O(n)。