【问题标题】:Time complexity - diagram时间复杂度 - 图
【发布时间】:2021-02-10 13:31:24
【问题描述】:

我正在尝试根据数据创建一个图表,其中我测量了数组中给定数量元素的时间执行。

我已经在 Excel 中制作了一个表格并创建了一个图表,但它不适合,因为我的程序的时间复杂度是 O(logn),而且图表的结果是线性的。

当我刷新浏览器时,给定数量的元素的执行时间非常接近,每个执行的时间都不同,比方说有 40-80 毫秒的差异。

我做错了什么,图表的时间复杂度与它的时间复杂度不同?

<script>

    //generate array
    var size = 10000000; // number of elements
    var max = 10000; // max value in the array
    var tab = [];
    
    for(k=0; k<size; k++)
    {
        los = Math.floor(Math.random() * max) + 1;
        tab[k] = los;
    }
    tab.sort(function(a, b) {return a - b;}); // 
    //------------------------------------------------
    
    
    function count(tab, w, n)
    {
        
        idMin = first(tab, 0, n-1, w, n);    
        
        
        if (idMin == -1){return idMin};         
        
    
        idMax = last(tab, idMin, n-1, w, n); 
        amount = idMax-idMin+1;                  
        
        return amount;                           
    }
    
    function first(tab, l, p, w, n) 
    {
        if(l <= p) 
        {
            mid = Math.floor((l+p)/2); 
            
            if((mid == 0 || w  > tab[mid-1])&&(tab[mid] == w)) 
            {
                return mid; 
            }
            else if(w > tab[mid])
            {
                return first(tab, (mid+1), p, w, n);
            }
            else
            {
                return first(tab, l, (mid-1), w, n);
            }
        }
        return -1;
    }
    
    function last(tab, l, p, w, n)
    {
        if(l <= p)
        {
            mid2 = Math.floor((l+p)/2);
                
            if((mid2 == n-1 || w < tab[mid2+1]) && (tab[mid2] == w))
            {
                return mid2; 
            }
            else if(w < tab[mid2])
            {
                return last(tab, l, (mid2-1), w, n);
            }
            else
            {
                return last(tab, (mid2+1), p, w, n);
            }
        }   
    }
    

    w = 49; //searching value
    n = tab.length; 
    
    console.time("test");
    how_many = count(tab, w, n); 
    console.timeEnd("test");
    
    if(how_many == -1)
    {
        document.write("The value "+w+" showed 0 times<br/>");
    }
    else
    {
        document.write("The value "+w+" showed "+how_many+" times<br/>");
    }

    
    
</script>

Excel中的图表

【问题讨论】:

    标签: javascript time-complexity diagram


    【解决方案1】:

    我认为tab.sort(function(a, b) {return a - b;}); 的时间复杂度是O(n logn) 而不是O(logn)

    正如this answer 所说,Chrome 等浏览器现在使用 Timsort 算法,其时间复杂度的下限为 O(n),上限为 O(n logn)。

    根据你这里给出的数据,元素的最大数量是最小数量的 20 倍。由于 log(20) 接近 1.3,接近 1,所以图中的线看起来是线性的。

    【讨论】:

    • 所以理论上我应该做更多的测试才能看到更好的结果?另一件事,tab.sort(function(a, b) {return a - b;});与此无关,因为我正在计算包​​括 first()、last() 在内的 count() 函数的时间执行(时间复杂度)。程序的其余部分只是添加。
    • 我没有仔细阅读所有代码,这是我的错。很抱歉。
    • 再说一次,我应该改变什么才能让图表更像对数函数?
    猜你喜欢
    • 1970-01-01
    • 2011-10-31
    • 2016-02-13
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    相关资源
    最近更新 更多