اوس به موږ ستونزه حل کړو، په یاد ولرئ چې صف ترتیب شوی دی. د حل لاره دا ده چې دوه شمیرې واخلئ: یو په پیل کې او بل په پای کې. که پایله د اړتیا سره توپیر ولري، نو د پیل او پای ټکي بدل کړئ.
په نهایت کې به موږ یا د مطلوب ارزښت سره مخ شو او ریښتیني راستون شو ، یا به د پیل او پای ټکي سره یو ځای شي او غلط بیرته راستانه شي.
const findSum = (arr, val) => {
let start = 0;
let end = arr.length - 1;
while (start < end) {
let sum = arr[start] + arr[end];
if (sum > val) {
end -= 1;
} else if (sum < val) {
start += 1;
} else {
return true;
};
};
return false;
};
اوس هر څه سم دي، د حل لاره غوره ښکاري. مګر څوک تضمین کولی شي چې صف امر شوی و؟
بیا څه؟
په لومړي نظر کې ، موږ کولی شو په ساده ډول لومړی صف ته امر کړی وای او بیا یې پورته حل کارولی وای. مګر دا به د اعدام وخت څنګه اغیزه وکړي؟
غوره الګوریتم د وخت پیچلتیا O (Nlog (N)) سره Quicksort دی. که موږ دا زموږ په غوره حل کې وکاروو، دا به خپل فعالیت له O (N) څخه O (Nlog (N)) ته بدل کړي. ایا دا ممکنه ده چې د غیر منظم شوي صف سره یو خطي حل ومومئ؟
// https://tc39.github.io/ecma262/#sec-array.prototype.includes
if (!Array.prototype.includes) {
Object.defineProperty(Array.prototype, 'includes', {
value: function(valueToFind, fromIndex) {
if (this == null) {
throw new TypeError('"this" is null or not defined');
}
// 1. Let O be ? ToObject(this value).
var o = Object(this);
// 2. Let len be ? ToLength(? Get(O, "length")).
var len = o.length >>> 0;
// 3. If len is 0, return false.
if (len === 0) {
return false;
}
// 4. Let n be ? ToInteger(fromIndex).
// (If fromIndex is undefined, this step produces the value 0.)
var n = fromIndex | 0;
// 5. If n ≥ 0, then
// a. Let k be n.
// 6. Else n < 0,
// a. Let k be len + n.
// b. If k < 0, let k be 0.
var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
function sameValueZero(x, y) {
return x === y || (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y));
}
// 7. Repeat, while k < len
while (k < len) {
// a. Let elementK be the result of ? Get(O, ! ToString(k)).
// b. If SameValueZero(valueToFind, elementK) is true, return true.
if (sameValueZero(o[k], valueToFind)) {
return true;
}
// c. Increase k by 1.
k++;
}
// 8. Return false
return false;
}
});
}
دلته د Array.prototype.include() تکراري برخه په 7 ګام کې د وخت لوپ دی چې (تقریبا) د ورکړل شوي سرې ټول اوږدوالی تیریږي. دا پدې مانا ده چې د دې وخت پیچلتیا هم خطي ده. ښه، ځکه چې دا تل زموږ د اصلي صف څخه یو ګام شاته وي، د وخت پیچلتیا O (N + (N - 1)) ده. د لوی O نوټیشن په کارولو سره ، موږ دا O (N) ته ساده کوو - ځکه چې دا N دی چې ترټولو لوی تاثیر لري کله چې د ان پټ اندازه زیاتیږي.