16.08.2017, 14:10
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от ksa
|
Это уже как тебе угодно...
|
Если речь об оптимизации, то обход массива можно производить с двух концов сразу, к центру, можно и наоборот, что уменьшит число итераций. Вот только если угадали с центром, то хорошо, а если нет, то ... искомое или в начале может быть, или в конце и т.д. А мне в общем-то все равно, не мне же нужно.
|
|
16.08.2017, 14:16
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,210
|
|
Сообщение от laimas
|
Если речь об оптимизации, то обход массива можно производить ...
|
Метод "деления пополам" это вего лишь один из способов работы с массивами. На большее я не претендую...
|
|
16.08.2017, 20:17
|
Аспирант
|
|
Регистрация: 24.07.2012
Сообщений: 37
|
|
Пока вот так - возвращает первый слева элемент который пересекается с входным диапазоном.
Осталось найти все интервалы когда входной диапазон большой.
<html>
<span> [8-16] [24-32] [40-48] [56-64] [72-80] [88-96] </span>
<br>
<input type="number" value="8" oninput="test()" /> и
<input type="number" value="" disabled="true" /> пересекается с
<input id="result" disabled="true" />
<style>
body {text-align:center}
span {display:inline-block; padding:15px; font-size:18px; font-family:consolas}
input {width:100px; height:50px; font-size:35px; text-align:center}
</style>
<script>
window.onload = test;
var intervals = [
{beg: 8, end: 16},
{beg: 24, end: 32},
{beg: 40, end: 48},
{beg: 56, end: 64},
{beg: 72, end: 80},
{beg: 88, end: 96}
];
function test(value)
{
var A = +document.querySelectorAll("input")[0].value;
var B = A + 2;
document.querySelectorAll("input")[1].value = B;
function bin_search_range(arr, A)
{
var min = 0;
var max = arr.length - 1;
while (min < max)
{
var mid = Math.floor((min + max) / 2);
if(arr[mid].end < A)
{
min = mid + 1;
}
else max = mid;
}
if(arr[min].beg <= B && arr[min].end >= A)
{
return arr[min].beg + "-" + arr[min].end;
}
return "...";
}
document.querySelector("#result").value = bin_search_range(intervals, A);
}
</script>
</html>
|
|
16.08.2017, 20:52
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Если диапазон большой и охватывает много интервалов, то лучше всего найти индексы первого и последнего интервалов (оба поиска - бинарные). Возможно, копировать все интервалы между ними в отдельный массив необязательно.
|
|
16.08.2017, 21:19
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,108
|
|
оптимизация: цикл только по "нужным" элементам, после найденного первого. (проще конечно for и break)
можно вводить в диапазон оба параметра
<html><meta charset="utf-8">
<span> [8-16] [24-32] [40-48] [56-64] [72-80] [88-96] </span>
<br>
<input type="number" value="8" oninput="test()" /> и
<input type="number" value="28" oninput="test()" /> пересекается с
<input id="result" disabled="true" style="width: 500px;font-size:12px; "/>
<style>
body {text-align:center}
span {display:inline-block; padding:15px; font-size:18px; font-family:consolas}
input {width:100px; height:50px; font-size:35px; text-align:center}
</style>
<script>
window.onload = test;
var intervals = [
{beg: 8, end: 16},
{beg: 24, end: 32},
{beg: 40, end: 48},
{beg: 56, end: 64},
{beg: 72, end: 80},
{beg: 88, end: 96}
];
function test(value) {
var A = +document.querySelectorAll("input")[0].value;
var B = +document.querySelectorAll("input")[1].value;
function bin_search_range(arr, A) {
var min = 0;
var max = arr.length - 1;
var temp = [];
while (min < max) {
var mid = Math.floor((min + max) / 2);
if (arr[mid].end < A) min = mid + 1;
else max = mid
}
if (arr[min].beg <= B && arr[min].end >= A) {
arr.slice(min).some(function(el) {
return !(el.beg <= B && el.end >= A && temp.push(el))
});
return JSON.stringify(temp)
}
return "..."
}
document.querySelector("#result").value = bin_search_range(intervals,A)
};
</script>
</html>
|
|
16.08.2017, 21:39
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,108
|
|
Сообщение от Alexandroppolus
|
то лучше всего найти индексы первого и последнего интервалов
|
<html><meta charset="utf-8">
<span> [8-16] [24-32] [40-48] [56-64] [72-80] [88-96] </span>
<br>
<input type="number" value="78" oninput="test()" /> и
<input type="number" value="90" oninput="test()" /> пересекается с
<input id="result" disabled="true" style="width: 500px;font-size:12px; "/>
<style>
body {text-align:center}
span {display:inline-block; padding:15px; font-size:18px; font-family:consolas}
input {width:100px; height:50px; font-size:35px; text-align:center}
</style>
<script>
window.onload = test;
var intervals = [
{beg: 8, end: 16},
{beg: 24, end: 32},
{beg: 40, end: 48},
{beg: 56, end: 64},
{beg: 72, end: 80},
{beg: 88, end: 96}
];
function test(value) {
var A = +document.querySelectorAll("input")[0].value;
var B = +document.querySelectorAll("input")[1].value;
function bin_search_range(arr) {
var min = 0;
var max = arr.length - 1;
var temp;
while (min < max) {
var mid = Math.floor((min + max) / 2);
if (arr[mid].end < A) min = mid + 1;
else max = mid
}
max = arr.length - 1;
temp = min
while (min < max) {
var mid = Math.floor((min + max) / 2);
if (arr[mid].beg < B) min = mid + 1;
else max = mid
}
if (arr[temp].beg <= B && arr[temp].end >= A) {
if (arr[min].beg <= B && arr[min].end >= A) ++min;
return JSON.stringify(arr.slice(temp,min))
}
return "..."
}
document.querySelector("#result").value = bin_search_range(intervals)
};
</script>
</html>
Последний раз редактировалось рони, 16.08.2017 в 21:43.
|
|
16.08.2017, 22:38
|
Аспирант
|
|
Регистрация: 24.07.2012
Сообщений: 37
|
|
рони, то что нужно!) Всем больше спасибо за помощь!
|
|
16.08.2017, 23:20
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,108
|
|
HJ90,
<html><meta charset="utf-8">
<span> [8-16] [24-32] [40-48] [56-64] [72-80] [88-96] </span>
<br>
<input type="number" value="18" oninput="test()" /> и
<input type="number" value="59" oninput="test()" /> пересекается с
<input id="result" disabled="true" style="width: 500px;font-size:12px; "/>
<style>
body {text-align:center}
span {display:inline-block; padding:15px; font-size:18px; font-family:consolas}
input {width:100px; height:50px; font-size:35px; text-align:center}
</style>
<script>
window.onload = test;
var intervals = [
{beg: 8, end: 16},
{beg: 24, end: 32},
{beg: 40, end: 48},
{beg: 56, end: 64},
{beg: 72, end: 80},
{beg: 88, end: 96}
];
function test(value) {
var A = +document.querySelectorAll("input")[0].value;
var B = +document.querySelectorAll("input")[1].value;
function bin_search_range(arr) {
for (;arr.length; ) {
if (arr[0].beg <= B && arr[0].end >= A) {
break;
}
arr = arr.slice(1);
}
var i=arr.length;
for (; i-- ;) {
if (arr[i].beg <= B && arr[i].end >= A) {
arr = arr.slice(0,++i); break;
}
}
if (arr.length) {
return JSON.stringify(arr)
}
return "..."
}
document.querySelector("#result").value = bin_search_range(intervals)
};
</script>
</html>
|
|
16.08.2017, 23:28
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,108
|
|
HJ90,
<html><meta charset="utf-8">
<span> [8-16] [24-32] [40-48] [56-64] [72-80] [88-96] </span>
<br>
<input type="number" value="18" oninput="test()" /> и
<input type="number" value="59" oninput="test()" /> пересекается с
<input id="result" disabled="true" style="width: 500px;font-size:12px; "/>
<style>
body {text-align:center}
span {display:inline-block; padding:15px; font-size:18px; font-family:consolas}
input {width:100px; height:50px; font-size:35px; text-align:center}
</style>
<script>
window.onload = test;
var intervals = [
{beg: 8, end: 16},
{beg: 24, end: 32},
{beg: 40, end: 48},
{beg: 56, end: 64},
{beg: 72, end: 80},
{beg: 88, end: 96}
];
function test(value) {
var A = +document.querySelectorAll("input")[0].value;
var B = +document.querySelectorAll("input")[1].value;
function bin_search_range(arr) {
for (;arr.length; ) {
if (arr[0].beg <= B && arr[0].end >= A) {
break;
}
arr = arr.slice(1);
}
for (var i=0; i<arr.length; i++) {
if (arr[i].beg <= B && arr[i].end >= A) continue;
else {arr = arr.slice(0,i); break;}
}
if (arr.length) {
return JSON.stringify(arr)
}
return "..."
}
document.querySelector("#result").value = bin_search_range(intervals)
};
</script>
</html>
|
|
16.08.2017, 23:49
|
Аспирант
|
|
Регистрация: 24.07.2012
Сообщений: 37
|
|
рони, круто! Правда с бинарным поиском меньше итераций получается.
|
|
|
|