Gyakorlati alapok

Keresések választási lehetőséggel

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

A fejezet gondolati és tartalmi előzményei Keresések rendezett tömbben című fejezetben tanulmányozhatók.

 

Ebben a fejezetben a jelen fejezetcsomag kívánalmai szerint mindent külön metódusokba csoportosítunk, legfőképpen a publikált felezéses és bináris keresést, továbbá:

További sajátos feltétel: a felhasználó választhasson aközött, hogy melyik kereső algoritmust futtatja le, a felezéses vagy a bináris keresést (String[] menu = new String[] {"1 - Felezéses keresés", "2 - Bináris keresés", "0 - Kilépés"};). Futási különbségeket persze nem fog érzékelni, azok csak nagy léptékek, például egy óriási méretű adatbázis esetén jönnek elő. Valójában a menüből adódóan képes egymás után mindkét algoritmust lefuttatni ugyanarra a bemeneti adathalmazra, amivel nyilvánvalóan tesztelheti is pontosságukat.

 

Az előzmények során (Keresések rendezett tömbben című fejezet) az algoritmusok eredménykiíráskor nem vették figyelembe a számredundanciát, azaz több azonos szám esetén az utolsó indexet írták ki. Például:

 

7

A rendezett tömb:
7 7 22 31 36 50 62 77 89 93

A keresett benne van a tömbben, a(z) 2. indexen.

 

A probléma természetesen orvosolható egy olyan véletlenszám-generátorral, amelyik ezt nem engedi meg, azaz csakis egyedi véletlenszámokat állít elő (static int[]veletlenSzamGenerator()).

 

Nézzük meg a futtatható Java-kódot:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

import java.util.*;

public class Main {
static int[]veletlenSzamGenerator(){
    Random rnd = new Random();
    int[] tombVeletlenSzam = new int[10];
    int szamlalo = 0;
    while(szamlalo < 10) {
        int szam = rnd.nextInt(100) + 1;
        boolean benneVan = false;
        for(int j = 0; j < szamlalo; j++) {
            if(tombVeletlenSzam[j] == szam) {
            benneVan = true;
            }
        }
    if(benneVan == false) {
        tombVeletlenSzam[szamlalo] = szam;
        szamlalo++;
        }
    }
    return tombVeletlenSzam;
}

static int[]cseresRendezes(int[] tomb){
    for(int i = 0; i <= tomb.length - 1; i++){
        for(int j = i + 1; j <= tomb.length - 1; j++){
            if(tomb[i] > tomb[j]){
                int tarolo = tomb[i];
                tomb[i] = tomb[j];
                tomb[j] = tarolo;
                }
            }
        }
        return tomb;
    }

static void tombKiiras(int[] tomb){
    for(int i = 0; i < tomb.length; i++){
        System.out.print(tomb[i] + " ");
        }
    }

static int szamBekeres(){
    Scanner in = new Scanner (System.in);
    String bemenetiAdat = new String();
    System.out.println ("\nKérem, hogy adja meg a számot!");
    bemenetiAdat = in.nextLine();
    int keresettSzam = Integer.parseInt(bemenetiAdat);
    while (keresettSzam < 1 || keresettSzam > 100){
        System.out.println("Kérem, hogy csak pozitív egész számot adjon meg 1 és 100 között!");
        bemenetiAdat = in.nextLine();
        keresettSzam = Integer.parseInt(bemenetiAdat);
    }
    return keresettSzam;
}

static int[] binarisKereses(int[] tomb, int keresettSzam) {
    int[] talalatiTomb = new int[2];
    int alsoHatar = 0;
    int felsoHatar = tomb.length;
    boolean talalat = false;
    int kozep = -1;
    while (!talalat && alsoHatar <= felsoHatar) {
        kozep = (alsoHatar + felsoHatar) / 2;
        if(keresettSzam == tomb[kozep]) {
            talalat = true;
            talalatiTomb[0] = 1;
            talalatiTomb[1] = kozep+1;
        } else if(tomb[kozep] < keresettSzam) {
        alsoHatar = kozep+1;
        } else {
    felsoHatar = kozep-1;
    }
    }
    return talalatiTomb;
}

static int[] felezesesKereses(int[] tomb, int keresettSzam){
    int[] talalatiTomb = new int[2];
    boolean talalat = false;
    int kozep = tomb.length / 2;
    if((keresettSzam >= tomb[kozep])){
        for(int i = kozep; i < tomb.length; i++){
            if(tomb[i] == keresettSzam){
                talalat = true;
                talalatiTomb[0] = 1;
                talalatiTomb[1] = i + 1;
                break;
            }
        }
    }
    else if(keresettSzam < tomb[kozep]){
        for(int i = kozep; i >= 0; i--){
            if((tomb[i] == keresettSzam)){
                talalat = true;
                talalatiTomb[0] = 1;
                talalatiTomb[1] = i + 1;
                break;
                }
            }
        }
    return talalatiTomb;
}

static void kiertekeles(int[] talalatiTomb){
    if(talalatiTomb[0] == 1) {
        System.out.println("A szám benne van a tömbben a(z) " + talalatiTomb[1] + ". indexen");
    }
    else{
        System.out.println("A szám nincs benne a tömbben.");
    }
}

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int[] tombVeletlenSzam = new int[10];
    int[] tombVeletlenSzamRendezett = new int[10];
    int[] talalatiTomb = new int[2];
    int keresettSzam = 0;
    boolean voltMuvelet = false;
    String[] menu = new String[] {"1 - Felezéses keresés", "2 - Bináris keresés", "0 - Kilépés"};

    tombVeletlenSzam = veletlenSzamGenerator();
    System.out.println("A véletlenszámok:");
    tombKiiras(tombVeletlenSzam);
    System.out.println();

    tombVeletlenSzamRendezett = cseresRendezes(tombVeletlenSzam);
    System.out.println("\nA véletlenszámok rendezve:");
    tombKiiras(tombVeletlenSzamRendezett);
    System.out.println();

    keresettSzam = szamBekeres();

    while(true) {
        System.out.println("\nKérem válasszon az alábbi lehetőségekből: ");
        for(int i = 0; i < menu.length; i++) {
            System.out.println(menu[i]);
        }

    String valasztas = in.nextLine();
    if("1".equals(valasztas)) {
        talalatiTomb = felezesesKereses(tombVeletlenSzamRendezett, keresettSzam);
        kiertekeles(talalatiTomb);
        voltMuvelet = true;
    }

    if("2".equals(valasztas)) {
        talalatiTomb = binarisKereses(tombVeletlenSzamRendezett, keresettSzam);
        kiertekeles(talalatiTomb);
        voltMuvelet = true;
    }

    if("0".equals(valasztas)) {
        System.out.println("\nViszlát!");
        System.exit(0);
            }
        }
    }

}
 

Végeredmény (például):
A véletlenszámok:
12 62 83 70 46 66 97 10 2 23

A véletlenszámok rendezve:
2 10 12 23 46 62 66 70 83 97

Kérem, hogy adja meg a számot!
0
Kérem, hogy csak pozitív egész számot adjon meg 1 és 100 között!
102
Kérem, hogy csak pozitív egész számot adjon meg 1 és 100 között!
70

Kérem válasszon az alábbi lehetőségekből:
1 - Felezéses keresés
2 - Bináris keresés
0 - Kilépés
1
A szám benne van a tömbben a(z) 8. indexen

Kérem válasszon az alábbi lehetőségekből:
1 - Felezéses keresés
2 - Bináris keresés
0 - Kilépés
2
A szám benne van a tömbben a(z) 8. indexen

Kérem válasszon az alábbi lehetőségekből:
1 - Felezéses keresés
2 - Bináris keresés
0 - Kilépés
0

Viszlát!