Algorytmy do losowania wskazanej liczby z przedziału 0-1000

0

Witam,
mam dwa zadania w których muszę stworzyć dwa algorytmy szukające wcześniej wskazanej liczby w przedziale 0-1000. Pierwszy algorytm musi losować jakąś część przedziału. Jeżeli nie znajdzie wskazanej liczby w wylosowanym przedziale, wyklucza go i szuka w następnym przedziale (przedziały nie mogą być ustawione na sztywno) i tak aż znajdzie wskazaną liczbę. Drugi algorytm ma zmniejszać przedział o połowę również dopóki nie znajdzie wskazanej liczby.

Macie jakieś pomysły? :)
Główkuje główkuje i nic :D

0

W sensie pomysły na co? Przecież sam całkiem precyzyjnie opisałeś te algorytmy.

0

W sensie takim jak stworzyć taki algorytm, dopiero się uczę i szukam pomocy. :)

0

Potrafisz rozpisać go swoimi słowami na kartce w formie punktów/bloczków?

0

Spróbuję, ale nie robiłem jeszcze tego.

0

W chwili obecnej mój kod wygląda tak. Gdzieś się zaplątałem i nie mogę się z tego wydostać. Jest to kod do pierwszego algorytmu. Jakieś pomysły co można poprawić aby to śmigało?

import java.util.Scanner;
import java.util.Random;

public class AlgorytmZadanie {
	public static void main (String[] args) {
		Scanner reader = new Scanner(System.in);
		Random generator = new Random();
		
		
		int dg = 0; //dolna granica
		int gg = 1000; //górna granica
		int granica = 0; //zmienna przechowująca aktualnie wylosowaną granice w zakresie 
		int k; //liczba podana przez użytkownika
		
		System.out.println("Podaj liczbę do sprawdzenia: ");
		k = reader.nextInt();
		
		while (k < 0 || k >=1000);
		
		if (k==gg) {
			System.out.println("Poszukiwana liczba to : " + gg);
			System.out.println("Znaleziona w pierwszym kroku.");
		} else {
		
		if (k==dg) {	
			System.out.println("Poszukiwana liczba to: " + dg);
			System.out.println("Znaleziona w pierwszym kroku");	
		
		} else {
			
			for (int i=1; i<20; i++) {
				granica = generator.nextInt() & (gg-dg) + dg;	
				
			if (granica == k) {
				System.out.println("Poszukiwana liczba to: " + granica);
				System.out.println("Znaleziona w pierwszym kroku");	
				break;
			} else {
				if (granica > k) {
					gg = granica;
				} else {
					if (granica <k) {
						dg = granica;
						}
					}
				}
			}
			reader.close();
		}
		
	}
} 

}

0
  1. Na jakiej zasadzie odbywa się losowanie przedziału? Czy chodzi o wybranie jednego końca przedziału nazwanego r tak, że mamy [s, r] i (r, e] czy trzeba wybrać obydwa końce? Są jakieś ograniczenia co do złożoności algorytmu?
  2. Drugi algorytm nazywa się wyszukiwanie binarne.
0

Pierwszy algorytm to przedział [0-1000) - tak dokładnie mam zapisany w zadaniu, ograniczeń co do złożności nie ma. Algorytm ma być napisany prostym sposobem, który nie pochłania dużej ilości pamięci.

0
  1. while (k < 0 || k >=1000); - po co ten średnik na końcu?

  2. granica = generator.nextInt() & (gg-dg) + dg; - czy operator & na pewno jest tutaj adekwatny?

Jak na moje - piszesz zbyt duże ilości kodu naraz, zamiast tworzyć inkrementalnie (tzn. piszesz dużo, po czym dopiero sprawdzasz czy działa, zamiast na bieżąco).

Podziel algorytm na dokładną listę kroków i podeślij (w formie listy kroków, nie implementacji), a pomyślimy dalej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1