改善算法的运行时间

时间:2018-03-21 03:56:21

标签: javascript arrays function

我已经编写了这个函数来返回两个数组中相同值的新数组。它工作正常但我使用了两个循环,它给出了O(n ^ 2)的运行时间。任何改善此函数运行时的建议。

 var dynamicConfig = ["Test1","Test22","Test3","Test14"];
 var staticConfig = [{label: 'Test 1',value: 'Test1'},
                     {label: 'Test 2',value: 'Test2'},
                     {label: 'Test 3',value: 'Test3'}
                    ];

 function configObj(dynamicConfig, staticConfig) {
    var templateArray = [];
    for (var i = 0; i < dynamicConfig.length; i++) {
       for (var j = 0; j < staticConfig.length; j++) {
          if (dynamicConfig[i] === staticConfig[j].value) {
            templateArray.push(staticConfig[j]);
            break;
          }
        }
     }
     console.log(templateArray);
     return templateArray;
 }    
 configObj(dynamicConfig, staticConfig);

jsfiddle同样的工作。

3 个答案:

答案 0 :(得分:1)

何时找到数组中的公共元素,最好先对两个数组进行排序,然后很容易找到公共元素。 但是来到javascript你可以使用es6 Set功能来简化任务..

下面是我的代码,它可能显示为O(n ^ 2)但信任我Set.has的速度快于 array.indexOf这是证明 - &gt; https://jsperf.com/array-indexof-vs-set-has

let dynamicConfig1 = ["Test1","Test22","Test3","Test14"];
let staticConfig = [
                      {
                          label: 'Test 1',
                          value: 'Test1'
                      },
                      {
                          label: 'Test 2',
                          value: 'Test2',
                      },
                      {
                          label: 'Test 3',
                          value: 'Test3',
                      }
                  ];
    let  dynamicConfig = new Set([...dynamicConfig1.map((item)=>item)])
let commonElements =  [...staticConfig].filter(x => dynamicConfig.has(x.value));
console.log(commonElements)

js为同一个http://jsfiddle.net/yvv2mdkr/70/

而小提琴

答案 1 :(得分:0)

一种解决方案是将第二个'staticConfig'数组转换为javascript对象或将其转换为javascript对象。 Javascript在内部使用hashmap来实现任何对象。然后,您可以使用具有复杂度O(1)的map ['Test 1']来获取对象。但是您必须在单独的循环中转换列表以在对象中进行转换。整体复杂性将来自O(n)。由于您只需要比较'staticConfig'中对象的值字段,您也可以使用javascript set object。 你可以尝试这样的事情:

<?php  

include '../includes/config.php';

//SQL QUERY
$query = mysqli_query($conn, "SELECT * FROM post ORDER BY id ASC");

if (isset($_POST["submit"])) {
    $title = $_POST["title"];
    $description = $_POST["description"];
    $article = $_POST["article"];
}

?>
//HTML
<?php if (isset($_POST["update"])) { ?>
<body>
    <form method="post">
      <div class="form-group">
        <label for="exampleFormControlFile1">Choose the image</label>
        <input type="file" class="form-control-file" id="exampleFormControlFile1">
      </div>
      <div class="form-group">
        <label">Title</label>
        <input type="text" class="form-control" name="title" placeholder="Title" <?php echo $row["title"]; ?>>
      </div>
      <div class="form-group">
        <label for="exampleInputPassword1">Description</label>
        <input type="text" class="form-control" name="description" placeholder="Description">
      </div>
      <div class="form-group">
        <label for="exampleFormControlTextarea1">Article</label>
        <textarea class="form-control" name="article" rows="3"></textarea>
      </div>
      <button type="submit" class="btn btn-primary" name="submit">Post</button>
    </form>
    <?php if (mysqli_num_rows($query)) { ?>
        <?php while ($row = mysqli_fetch_array($query)) {?>
            <strong>
                <h1><?php echo $row["title"]; ?></h1>
            </strong>
            <h3><?php echo $row["description"]; ?></h3>
            <p><?php echo $row["article"]; ?></p>
            <button class="btn btn-warning" name="update">
                <a href="#">Update</a>
            </button>
            <hr />
        <?php } ?>
    <?php } ?>
</body>

或使用Set

var dynamicConfig = ["Test1","Test22","Test3","Test14"];
var staticConfig = [{label: 'Test 1',value: 'Test1'},
				 {label: 'Test 2',value: 'Test2'},
				 {label: 'Test 3',value: 'Test3'}
				];
var map = {};
for(var i = 0; i < staticConfig.length; i++){
	var obj = staticConfig[i];
	map[obj.value] = obj.label;
}

function configObj(dynamicConfig, staticConfig) {
var templateArray = [];
   for (var j = 0; j < dynamicConfig.length; j++) {
	  if (map[dynamicConfig[j]] != null && map[dynamicConfig[j]] != undefined && map[dynamicConfig[j]] != 'undefined') {
		templateArray.push(dynamicConfig[j]);
	  }
   }
 
 console.log(templateArray);
 return templateArray;
}    
configObj(dynamicConfig, staticConfig);

答案 2 :(得分:-1)

以下代码的时间复杂度为O(n)。你也可以比较一下 通过计算开始和结束时间来执行循环所花费的时间。

&#13;
&#13;
    var dynamicConfig = ["Test1","Test22","Test3","Test14"];
    var staticConfig = [{label: 'Test 1',value: 'Test1'},
                     {label: 'Test 2',value: 'Test2'},
                     {label: 'Test 3',value: 'Test3'}
                    ];

    function configObj(dynamicConfig, staticConfig) {
    var templateArray = [];
       for (var j = 0; j < staticConfig.length; j++) {
          if (dynamicConfig.includes(staticConfig[j].value)) {
            templateArray.push(staticConfig[j]);
          }
       }
     
     console.log(templateArray);
     return templateArray;
    }    
    configObj(dynamicConfig, staticConfig);
&#13;
&#13;
&#13;