我已经编写了一个解决方案来获取通过表单输入的整数列表。有用。它为您提供了两个最大整数的总和,并将其发布在DOM中。 但是,对于100万个整数的大型数组来说,它并不是非常有效。
如何提高此解决方案的效率。
// This function reverses the order of the array and places the biggest numbers first
function sortNumber(a, b) {
return b - a;
}
// this function is used to ensure the user didn't enter any letters
function getArray() {
var alphaExp = /^[a-zA-Z]+$/;
// This function takes the array, orders it, adds the sum of the two largest numbers and returns the value
function sumOf(x) {
// Sort the ary with the sortNumber function
array.sort(sortNumber);
// Then we add the two biggest numbers of the array and save it to the result variable.
var result = array[0] + array[1];
// Then we share the result with the user by updating the browser
var myHeading = document.querySelector('h2');
myHeading.textContent = "The sum of your two biggest numbers is: " + result;
// Like a good student, it's important to show your work
var showYourWork = document.querySelector('h3');
showYourWork.textContent = array[0] + " + " + array[1] + " = " + result;
}
// This grabs the value of the input
var arrayField = document.getElementById('arrayField').value;
if (arrayField.match(alphaExp)) {
// Fail if user enters letters
var raiseError = document.querySelector('h5');
raiseError.textContent = 'No not letters! We want numbers!!';
} else {
var array = JSON.parse("[" + arrayField + "]");
if (arrayField.length < 2) {
// If the user enters only 1 number, tell them to enter more!
var raiseError = document.querySelector('h5');
raiseError.textContent = 'Please enter atleast two numbers seperated by commas for us to add!'
} else {
// When the user enters a list of numbers, run the sumOf function.
sumOf(arrayField);
//Make the error go away
var raiseError = document.querySelector('h5');
raiseError.textContent = '';
}
}
};
// use an eventlistener for the event (This is where the magic happens)
var subButton = document.getElementById('subButton');
subButton.addEventListener('click', getArray, false);
答案 0 :(得分:3)
您不必对其进行排序,只需线性搜索两个最大的:
编辑:下面的代码现在可以正常工作,并且比OP的代码渐进地快。 OP首先进行排序,可以在O(n log n)中进行排序,假定随机列表。我的代码使用struct.unpack("<h", bytes([b, a]))[0]
对O(cn)
中的列表进行线性搜索(两个循环不是必需的,但很简单)。具有c = 2
正整数的ceil(n log n) = 2n
的解是14,对于超过14个条目的每个列表,下面的代码更快。例如:对于一百万个条目,该关系为13,815,511到2,000,000,比其快六倍多。你可以在一个循环中做同样的事情,它将运行时间减半(理论上,但由于更好的局部性,它也快一点)。
n
编辑-2:上面的代码function maxtwo_wrong(a){
var b1 = -Infinity;
var b2 = -Infinity;
for (var i=0; i < a.length; i++) {
if (a[i] > b1) {
b1 = a[i];
}
}
for (var i=0; i < a.length; i++) {
if (a[i] > b2 && a[i] < b1) {
b2 = a[i];
}
}
return [b1,b2];
}
似乎不符合要求,所以我写了另一个maxtwo_wrong
并将其放在下面。请OP,告诉我哪一个符合您的要求,以便我可以删除错误的一个。
EDIT-3:更简单,更正确。
maxtwo_right
答案 1 :(得分:1)
我终于找到了一些时间坐下来解决这个问题。 我看错了。
这是我的新解决方案
<select ng-change="getMileWorkerlist(broadcastManagerData.project_list)" ng-model="broadcastManagerData.project_list" name="project_list" class="form-control" required >
<option value="0">All Project</option>
<option ng-repeat="(key, value) in projectList" value="{{key}}">{{value}}</option>
</select>
这个解决方案很大程度上受到@deamentiaemundi的启发 谢谢你。