Я постараюсь, чтобы все было коротко и ясно.Допустим, у вас есть отсортированный массив A .Этот массив содержит элементы в возрастающих значениях.Вы должны найти определенный элемент внутри этого массива.Вы хотите разбить весь этот массив на подмассивы так, чтобы время доступа к i -ому элементу в массиве не было прямо пропорционально i .Это означает, что не лайнер более быстрый метод.В помощь приходит Серия Фибоначчи .Одним из наиболее важных свойств ряда Фибоначчи является « золотое сечение ».Вы разбиваете массив на подмассивы по индексам, которые входят в ряд Фибоначчи (0,1,1,2,3,5,8,13,21, 34 ...).
Таким образом, ваш массив будет разбит на интервалы, такие как A [ 0 ] ... A [ 1 ], A [ 1 ]...A [ 1 ], A [ 1 ] ... A [ 2 ], A [ 2 ] ...A [ 3 ], A [ 3 ] ... A [ 5 ], A [ 5 ] ... A [ 13 ], A [ 13 ] ... A [ 21 ], A [ 21 ] ... A [ 34 ] и так далее.Теперь, когда массив отсортирован, просто глядя на начальный и конечный элемент любого раздела, вы узнаете, в каком разделе находится ваш номер. Итак, вы пересекаете элементы A [ 0 ], A [ 1 ], A [ 2 ], A [ 3 ], A [ 5 ], A [ 8 ], A [ 13 ], A [ 21 ], A [ 34 ] ... если текущий элемент больше, чем искомый элемент.Теперь вы уверены, что ваш номер лежит между этим текущим элементом и последним элементом, который вы посетили.
Далее, вы сохраняете элементы от A [ f (i-1) ] .. A[ f (i) ], где i - индекс, который вы в настоящее время просматривали;f ( x ) - ряд Фибоначчи, и повторите ту же процедуру, если не найдете свой элемент.
Если вы попытаетесь вычислить сложность этого подхода, этобыть O (log (x)).Преимущество этого заключается в уменьшении «среднего» времени, необходимого для поиска.
Полагаю, вы сможете написать код самостоятельно.