Javascript 异形字典算法-时间复杂度

Javascript 异形字典算法-时间复杂度,javascript,time,time-complexity,Javascript,Time,Time Complexity,我实现了外星人字典算法,但我不确定它的时间复杂性 问题: 令人惊讶的是,在一种外来语言中,他们也使用英语小写字母,但可能顺序不同。字母表的顺序是一些小写字母的排列 给定用外文书写的单词序列和字母表的顺序,当且仅当给定单词按此外文语言的词典排序时,返回true 算法: var isAlienSorted = function(words, order) { if(!words || words.length === 0) return true; const dic

我实现了外星人字典算法,但我不确定它的时间复杂性

问题: 令人惊讶的是,在一种外来语言中,他们也使用英语小写字母,但可能顺序不同。字母表的顺序是一些小写字母的排列

给定用外文书写的单词序列和字母表的顺序,当且仅当给定单词按此外文语言的词典排序时,返回true

算法:

var isAlienSorted = function(words, order) {
     if(!words || words.length === 0)   return true;
    
    const dict = {};
    for (let i=0; i<order.length; i++) {
        dict[order[i]] = i;
    }
    
    for(let i=1; i<words.length; i++) {
        if(!helper(words[i-1], words[i], dict)){
            return false;
        }
    }
    
    return true;
};

const helper = (str1, str2, order) => {
    for(let j=0; j<str1.length; j++) {
        if(j > str2.length-1)   return false;
        if(order[str1[j]] > order[str2[j]])
            return false
        else if(order[str1[j]] < order[str2[j]])
            return true;
    }
    
    return true;
}
var isAlienSorted=函数(字、顺序){
如果(!words | | words.length==0)返回true;
常量dict={};
for(设i=0;i顺序[str2[j]]
返回错误
else if(订单[str1[j]<订单[str2[j]])
返回true;
}
返回true;
}
我相信时间复杂度是O(N),其中N是单词数组中的元素数,但我不确定,因为在helper函数中有另一个循环。它是否使时间复杂度为O(N2)

谢谢

isAlienSorted=function(单词、顺序){
如果(!words | | words.length==0)返回true;
常量dict={};
for(设i=0;i顺序[str2[j]]
返回错误
else if(订单[str1[j]<订单[str2[j]])
返回true;
}
返回true;
}
时间复杂度:O(N*N)

我认为你是对的。对于每个单词,您都在第二次循环。所以我认为O(N^2)听起来是正确的。你也有一些例子吗?谢谢你的解释。有可能使它O(N)吗?我可以试试,请提供一些输入和案例,以确认。输入:words=[“word”,“world”,“row”],order=“worldabcefghijkmnpqstuvxyz”输出:错误解释:在这种语言中,由于“d”在“l”之后,那么words[0]>words[1],因此序列是未排序的。我在这里尝试过,它正在工作。需要把边缘的情况下,但我想这是可能的,使它在O(N)。如果您需要更多信息,也可以查看并告知我。感谢您的努力,但输入失败:words=[“hello”,“last”]order=“hlabcdefgijkmnopqrstuvxyz”。这应该是真的
isAlienSorted = function(words, order) {
     if(!words || words.length === 0)   return true;
    
    const dict = {};
    for (let i=0; i<order.length; i++) { --------------------O(N) (one loop only)
        dict[order[i]] = i;
    }
    
    for(let i=1; i<words.length; i++) { ----------------------O(N) (one loop only)
        if(!helper(words[i-1], words[i], dict)){-------------O(N) (one loop only)
            return false;
        } --------------------------------O(N*N) 
    }
    
    return true;
};



const helper = (str1, str2, order) => {
    for(let j=0; j<str1.length; j++) { ----------------------O(N) (one loop only)
        if(j > str2.length-1)   return false;
        if(order[str1[j]] > order[str2[j]])
            return false
        else if(order[str1[j]] < order[str2[j]])
            return true;
    }
    
    return true;
}

TimeComplexity : O(N*N)