Бұл оқулық екілік іздеу & Java тіліндегі рекурсивті екілік іздеу, оның алгоритмі, іске асыру және Java екілік іздеу коды мысалдары:
Java тіліндегі екілік іздеу коллекциядағы мақсатты мәнді немесе кілтті іздеу үшін пайдаланылатын әдіс болып табылады. Бұл кілтті іздеу үшін «бөліп ал және жең» әдісін қолданатын әдіс.
Кілтті іздеу үшін екілік іздеу қолданылатын жинақты өсу ретімен сұрыптау керек.
Әдетте, бағдарламалау тілдерінің көпшілігі жинақтағы деректерді іздеу үшін қолданылатын сызықтық іздеу, екілік іздеу және хэштеу әдістерін қолдайды. Біз келесі оқулықтарымызда хэштеуді үйренеміз.
Java тіліндегі екілік іздеу
Сызықтық іздеу негізгі әдіс болып табылады. Бұл әдістемеде массив дәйекті түрде өтеді және кілт табылғанша немесе массивтің соңына жеткенше әрбір элемент кілтпен салыстырылады.
Сызықтық іздеу практикалық қолданбаларда сирек қолданылады. Екілік іздеу - ең жиі қолданылатын әдіс, өйткені ол сызықтық іздеуге қарағанда әлдеқайда жылдамырақ.
Java екілік іздеуді орындаудың үш әдісін ұсынады:
- Қолдану итеративті тәсіл
- Рекурсивті тәсілді қолдану
- Arrays.binarySearch () әдісін пайдалану.
Осы оқулықта біз осылардың барлығын жүзеге асырып, талқылаймыз. 3 әдіс.
Java тіліндегі екілік іздеу алгоритмі
Екілік жүйедеіздеу әдісі бойынша коллекция қайта-қайта жартыға бөлінеді және кілттің топтаманың орта элементінен кіші немесе үлкен болуына байланысты негізгі элемент коллекцияның сол немесе оң жартысында ізделеді.
Қарапайым екілік іздеу алгоритмі келесідей:
- Жиынның ортаңғы элементін есептеңіз.
- Негізгі элементтерді ортаңғы элементпен салыстырыңыз.
- Егер кілт = ортаңғы элемент болса, онда табылған кілт үшін ортаңғы индекс орнын қайтарамыз.
- Else If key > ортаңғы элемент, содан кейін кілт коллекцияның оң жақ жартысында болады. Осылайша, жинақтың төменгі (оң) жартысында 1-3 қадамдарды қайталаңыз.
- Else пернесі ортаңғы элемент, содан кейін кілт коллекцияның жоғарғы жартысында болады. Сондықтан екілік іздеуді жоғарғы жартысында қайталау керек.
Жоғарыдағы қадамдардан көріп отырғаныңыздай, Екілік іздеуде жинақтағы элементтердің жартысы бірінші салыстырудан кейін ғана еленбейді.
Бірдей қадамдар тізбегі итеративті және рекурсивті екілік іздеу үшін де орындалатынын ескеріңіз.
Мысал арқылы екілік іздеу алгоритмін суреттейік.
Мысалы , 10 элементтен тұратын келесі сұрыпталған массивді алыңыз.
Массивтің ортаңғы орнын есептейік.
Орта = 0+9/2 = 4
#1) Кілт = 21
Алдымен кілт мәнін келесімен салыстырамыз [mid] элементі және біз элемент мәнін анықтаймызmid = 21.
Осылайша біз сол кілтті = [орта] табамыз. Демек, кілт массивтің 4-ші орнында орналасқан.
#2) Кілт = 25
Алдымен кілтті салыстырамыз. мәні ортасына дейін. (21 25) ретінде біз кілтті массивтің жоғарғы жартысынан тікелей іздейміз.
Енді қайтадан жоғарғы жартысының ортасын табамыз. массив.
Орта = 4+9/2 = 6
Орналасудағы мән [орта] = 25
Енді біз негізгі элементті ортаңғы элементпен салыстыру. Сонымен (25 == 25), демек, біз кілтті [ортаңғы] = 6 орнында таптық.
Осылайша, біз массивті қайта-қайта бөлеміз және негізгі элементті ортасымен салыстыра отырып, біз қай жартысында болатынын шешеміз. кілтті іздеңіз. Екілік іздеу уақыты мен дұрыстығы жағынан тиімдірек және де жылдамырақ.
Екілік іздеуді іске асыру Java
Жоғарыдағы алгоритмді пайдалана отырып, Java тілінде екілік іздеу бағдарламасын іске асырайық. итеративті тәсіл. Бұл бағдарламада біз мысал массивін аламыз және осы массивте екілік іздеуді орындаймыз.
import java.util.*; class Main{ public static void main(String args[]){ int numArray[] = {5,10,15,20,25,30,35}; System.out.println("The input array: " + Arrays.toString(numArray)); //key to be searched int key = 20; System.out.println("\nKey to be searched=" + key); //set first to first index int first = 0; //set last to last elements in array int last=numArray.length-1; //calculate mid of the array int mid = (first + last)/2; //while first and last do not overlap while( first = last ){ //if the mid key, then key to be searched is in the first half of array if ( numArray[mid] last ){ System.out.println("Element is not found!"); } } }
Шығыс:
Кіріс массиві: [5, 10, 15, 20 , 25, 30, 35]
Ізделетін кілт=20
Элемент индексте табылды: 3
Жоғарыдағы бағдарлама Екілік іздеудің итеративті тәсілін көрсетеді. Бастапқыда массив жарияланады, содан кейін ізделетін кілт анықталады.
Массивтің ортасын есептегеннен кейін кілт ортаңғы элементпен салыстырылады. Сосын, соған байланыстыкілт кілттен кіші немесе одан үлкен болса, кілт сәйкесінше массивтің төменгі немесе жоғарғы жартысында ізделеді.
Java тіліндегі рекурсивті екілік іздеу
Сонымен қатар екілік іздеуді орындауға болады. рекурсия әдісін қолдану. Мұнда екілік іздеу әдісі кілт табылмайынша немесе бүкіл тізім таусылғанша рекурсивті шақырылады.
Рекурсивті екілік іздеуді жүзеге асыратын бағдарлама төменде келтірілген:
import java.util.*; class Main{ //recursive method for binary search public static int binary_Search(int intArray[], int low, int high, int key){ //if array is in order then perform binary search on the array if (high>=low){ //calculate mid int mid = low + (high - low)/2; //if key =intArray[mid] return mid if (intArray[mid] == key){ return mid; } //if intArray[mid] > key then key is in left half of array if (intArray[mid] > key){ return binary_Search(intArray, low, mid-1, key);//recursively search for key }else //key is in right half of the array { return binary_Search(intArray, mid+1, high, key);//recursively search for key } } return -1; } public static void main(String args[]){ //define array and key int intArray[] = {1,11,21,31,41,51,61,71,81,91}; System.out.println("Input List: " + Arrays.toString(intArray)); int key = 31; System.out.println("\nThe key to be searched:" + key); int high=intArray.length-1; //call binary search method int result = binary_Search(intArray,0,high,key); //print the result if (result == -1) System.out.println("\nKey not found in given list!"); else System.out.println("\nKey is found at location: "+result + " in the list"); } }
Шығыс:
Енгізу тізімі: [1, 11, 21, 31, 41, 51, 61, 71, 81, 91
Ізделетін кілт :
Кілт мына жерде орналасқан: тізімде 3
Arrays.binarySearch () әдісін пайдалану.
Java тіліндегі массивтер класы берілген массивте екілік іздеуді орындайтын «binarySearch ()» әдісін қамтамасыз етеді. Бұл әдіс аргумент ретінде ізделетін массив пен кілтті алып, массивтегі кілт орнын қайтарады. Егер кілт табылмаса, әдіс -1 мәнін қайтарады.
Төмендегі мысал Arrays.binarySearch () әдісін жүзеге асырады.
import java.util.Arrays; class Main{ public static void main(String args[]){ //define an array int intArray[] = {10,20,30,40,50,60,70,80,90}; System.out.println("The input Array : " + Arrays.toString(intArray)); //define the key to be searched int key = 50; System.out.println("\nThe key to be searched:" + key); //call binarySearch method on the given array with key to be searched int result = Arrays.binarySearch(intArray,key); //print the return result if (result 0) System.out.println("\nKey is not found in the array!"); else System.out.println("\nKey is found at index: "+result + " in the array."); } }
Шығыс:
Кіріс массиві : [10, 20, 30, 40, 50, 60, 70, 80, 90]
Ізделетін кілт:50
Кілт алапта 4 индексінде табылады.
Жиі қойылатын сұрақтар
С №1) Екілік іздеуді қалай жазасыз ?
Жауап: Екілік іздеу әдетте массивті екіге бөлу арқылы орындалады. Егер ізделетін кілт ортаңғы элементтен үлкен болса,содан кейін массивтің жоғарғы жартысы одан әрі бөлу және ішкі массивті кілт табылғанша іздеу арқылы ізделеді.
Сол сияқты, егер кілт ортаңғы элементтен кіші болса, онда кілт төменгі жақтан ізделеді. массивтің жартысы.
2-сұрақ) Екілік іздеу қайда қолданылады?
Жауабы: Екілік іздеу негізінен ақпаратты іздеу үшін қолданылады. бағдарламалық қосымшалардағы деректер сұрыпталған, әсіресе жад кеңістігі шағын және шектеулі болса.
С №3) Екілік іздеудің үлкен O мәні қандай?
Жауап : Екілік іздеудің уақыт күрделілігі - O (logn), мұндағы n - массивтегі элементтердің саны. Екілік іздеудің кеңістік күрделілігі O (1).
Q #4) Екілік іздеу рекурсивті ме?
Жауап: Иә. Екілік іздеу бөлу және жеңу стратегиясының мысалы болғандықтан және оны рекурсия арқылы жүзеге асыруға болады. Массивті екіге бөліп, екілік іздеуді қайта-қайта орындау үшін бірдей әдісті шақыра аламыз.
С №5) Неліктен ол екілік іздеу деп аталады?
Жауап: Екілік іздеу алгоритмі массивті екіге немесе екі бөлікке қайта-қайта кесетін бөлу және жеңу стратегиясын пайдаланады. Осылайша ол екілік іздеу деп аталады.
Қорытынды
Екілік іздеу Java тілінде жиі қолданылатын іздеу әдісі болып табылады. Орындалатын екілік іздеуге қойылатын талап деректердің өсу ретімен сұрыпталуы керек.
Екілік іздеу болуы мүмкін.итеративті немесе рекурсивті тәсіл арқылы жүзеге асырылады. Java тіліндегі массивтер класы сонымен қатар массивте екілік іздеуді орындайтын "binarySearch" әдісін қамтамасыз етеді.
Келесі оқулықтарымызда біз Java тіліндегі әртүрлі сұрыптау әдістерін зерттейтін боламыз.