【问题标题】:How to display output of one function after another如何一个接一个地显示一个函数的输出
【发布时间】:2016-05-30 05:36:55
【问题描述】:

我编写了一个包含两种算法的 Javascript 文件。如下代码所示,我使用for loop 生成随机值,两种算法都将其用作输入。

目前,我正在交替显示binarySearchSearchSorted 的输出。

我面临的问题是我必须在主程序中传递randomlyGenerateArray生成的相同的数组值 对这两种算法进行有意义的比较。但我不知道如何更改输出格式。

我曾考虑将它们添加到不同的循环中,但正如我在上面解释的那样,我需要为两种算法使用相同的 randomArray 值。

即,下面的代码产生如下所示的输出 -

Binary Search Successful 1 Search Sorted Successful 5 Binary Search Successful 3 Search Sorted Successful 10

如何先显示 Binary Search 的输出,然后显示 Search Sorted 的输出?是这样的。任何帮助将不胜感激。

Binary Search Successful 1 Binary Search Successful 3 Search Sorted Successful 5 Search Sorted Successful 10

// Binary Search Algorithm
function binarySearch(A,K)
{
     var l = 0; // min
     var r = A.length - 1; //max
     var n = A.length;
     var operations = 0;

     while(l <= r)
     {   
          var m = Math.floor((l + r)/2);
          operations++;

          if(K == A[m])
          {
              console.log('Binary Search Successful %d',operations);
              return m;
          }
          else if(K < A[m])
          {
              r = m - 1;
          }
          else
          {
              l = m + 1;
          }
     }
     operations++;
     console.log('Binary Search Unsuccessful %d',operations);
     return -1;
}

// Search Sorted Algorithm
function searchSorted(A, K) 
{
    var n = A.length;
    var i = 0;
    var operations = 0;

    while (i < n) 
    {
        operations++;
        if (K < A[i]) 
        {
            return -1;
        }
        else if (K == A[i])
        {
            console.log('Search Sorted Successful %d', operations);
            return i;
        }
        else 
        {
            i = i + 1;
        }
   }
   operations++;
   console.log('Search Sorted Unsuccessful %d', operations);
   return -1;
}

// Random Array generator
var randomlyGenerateArray = function(size)
{
    var array = [];
    for (var i = 0; i < size; i++)
    {
        var temp = Math.floor(Math.random() * maxArrayValue);
        var final = array.splice(5, 0, 30);
        array.push(final);
    }
    return array;
}

//Sort the Array
var sortNumber = function(a, b)
{
    return a - b;
}

// Main Program
var program = function()
{
    var incrementSize = largestArray / numberOfArrays;
    for (var i = smallestArray; i <= largestArray; i += incrementSize)
    {
        var randomArray = randomlyGenerateArray(i);
        var sort = randomArray.sort(sortNumber);
        var randomKey = 30;
        binarySearch(sort, randomKey);
        searchSorted(sort, randomKey);
    }
}

var smallestArray = 10;
var largestArray = 10000;
var numberOfArrays = 1000;
var minArrayValue = 1;
var maxArrayValue = 1000;

program();

【问题讨论】:

  • 将二分搜索和排序搜索分成 2 个循环。另外,请澄清一下,您是否应该在每一步都生成一个新数组?
  • 我需要使用相同的randomArray 作为两种算法的输入。如果我将它们分开,那么我将不得不再次为另一个循环调用randomlyGenerateArray,这样就不会具有与另一个相同的数组值。

标签: javascript node.js algorithm sorting output


【解决方案1】:

您可以将排序后的 randomArrays 存储在一个数组中(我称之为 sortedRandomArrays),然后为每个搜索运行一个 for 循环。

主程序将如下所示:

// Main Program
var program = function()
{
    var incrementSize = largestArray / numberOfArrays;
    var sortedRandomArrays = [];
    for (var i = smallestArray; i <= largestArray; i += incrementSize)
    {
        var randomArray = randomlyGenerateArray(i));
        var sort = randomArray.sort(sortNumber);
        sortedRandomArrays.push(sort);
        var randomKey = 30;
    }

    for (var i = 0; i < sortedRandomArrays.length; i++)
    {
        binarySearch(sortedRandomArrays[i], randomKey);
    }

    for (var i = 0; i < sortedRandomArrays.length; i++)
    {
        searchSorted(sortedRandomArrays[i], randomKey);
    }
}

【讨论】:

    【解决方案2】:

    解决方案很简单:存储结果并使用 2 个单独的循环打印(从函数中取出打印)。

    var program = function()
    {
        var binarySearchResults = [];
        var sortedSearchResults = [];
        var incrementSize = largestArray / numberOfArrays;
        for (var i = smallestArray; i <= largestArray; i += incrementSize)
        {
            var randomArray = randomlyGenerateArray(i);
            var sort = randomArray.sort(sortNumber);
            var randomKey = 30;
            binarySearchResults[i] = binarySearch(sort, randomKey);
            sortedSearchResults[i] = searchSorted(sort, randomKey);
        }
    
        for (var i = smallestArray; i <= largestArray; i += incrementSize)
        {
           //print binary results
        }
    
        for (var i = smallestArray; i <= largestArray; i += incrementSize)
        {
           //print sorted results
        }
    
    }
    

    【讨论】:

    • 我编写上述代码的方式是为这两种算法重用randomArray 代码,如果我将其从循环中取出,它将不会创建不同长度的数组。我需要创建不同长度的数组,直到满足 for 循环条件,然后重用相同的数组。
    • 在您上面的第一个答案中,randomlyGenerateArray(i) 如果在循环之外使用,则不会创建不同长度的数组。它会给我一个未定义的错误。
    • 哦,所以每一步都需要一个新数组?
    • 是的,我正在尝试对两种算法进行经验比较。为此,我需要使用相同的数据进行有意义的比较。
    • 感谢您的回答和建议:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 2023-03-04
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多