Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Рекурсивный поиск, в векторе


Автор: VitaL 23.1.2009, 02:22
Пытаюсь реализировать следующий алгоритм который исчет рекурсивным методом все возможные наборы цифр сумма которых равняется цифре н

сделанный код

Код


package recursividad;
import java.io.*;
import java.util.*;



/**
 *
 * @author VitaL
 */
public class Main {
        int n,nn,i,ii;
        int pos = 0;
        int cont = 0;
        String texto1; 
        Vector C = null;
        Vector CC = null;
        InputStreamReader isr=new InputStreamReader(System.in);
        BufferedReader br=new BufferedReader(isr);
        
    public static void main(String[] args) throws IOException {
        Main prog = new Main();
//колличество цифр в векторе
        System.out.println("Ingrese el numero n, la cantidad de numeros positivos: ");
        prog.texto1=prog.br.readLine();
        prog.n = Integer.parseInt(prog.texto1);
        prog.C = new Vector(prog.n);
        prog.CC = new Vector(prog.n);
        while(prog.pos<prog.n){
//цифра в такомто месте в векторе
            System.out.println("Ingrese el numero "+(prog.pos+1)+" del conjunto C: ");
            prog.texto1=prog.br.readLine();
            prog.C.addElement (Integer.parseInt(prog.texto1));
            prog.pos++;
        }
        for(int j = 0; j<prog.n;j++){
           System.out.print ( prog.C.elementAt (j) + " "); 
        }
//цифра н которой должна равнятся сумма набора цифр
        System.out.println("\nIngrese el numero i: ");
        prog.texto1=prog.br.readLine();
        prog.i = Integer.parseInt(prog.texto1);
        for(int g = 0; g < prog.n ;g++){
            prog.CC.removeAllElements();
            prog.pos = 0;
            prog.cont = 0;
            prog.ii = 0;
            if(g != 0){
                prog.nn = (Integer)prog.C.elementAt(g);
                prog.C.set(g, prog.C.elementAt(0));
                prog.C.set(0, prog.nn);
            }
//            System.out.print ("\nConjuntos\n"); 
            prog.buscar_conjunto(prog.pos);
        }
    }
//Рекурсивная функция
        public void buscar_conjunto(int pos){
            if(pos<0 || pos>=C.size())
                return;

            CC.addElement(C.elementAt(pos));
            ii+=(Integer)C.elementAt(pos);
                
            if (ii == i){
                print();
                ii-=(Integer)C.elementAt(pos);
                CC.remove(C.elementAt(pos));
            }
            if(ii>i){
                ii-=(Integer)C.elementAt(pos);
                CC.remove(C.elementAt(pos));
            }
            buscar_conjunto(pos+1);
        }
        
        public void print(){
            System.out.print (CC); 
        }
}



испытательный пример.... вектор 1 2 3 4 5

цифра 5 которой должна равнятся сумма наборов цифр

результат [4, 1][5]

В результаты невходит [2,3]

Помогите разобраться пожалуйста  smile 
 

Автор: ecologist 23.1.2009, 08:46
А искать должен только сумму двух чисел или может быть и 3, и 5, и 10 ? 

Например в векторе есть 1, 2, 3, 4, 5, 6, 7, 8, 9, 10. Надо найти числа для 8. Это может быть - 3+5, 1+2+5, 7+1, 1+3+4.

Автор: math64 23.1.2009, 09:33
А зачем ты портишь исходный вектор C?
После того как ты удалил из него первый элемент, он стал [2, 3, 4, 5]. Дальше ты продолжаешь поиск с pos=1, т.е. 2 пропускаешь.

Автор: VitaL 23.1.2009, 13:54
набор цифр может быть с неважным колличесвтом цифр, главное чтоб их сумма равнялась цифре н

я  меняю местами элементы в векторе для дальнейшего поиска, например

вектор 1 2 3 4 5 

начинаю поиск с 1 пробую все варианты с оставшимися цифрами

возвращаюсь, делаю тоже самое но теперь первый элемент это тот который был на втором месте

меняю местами 1 и 2

начинаю поиск с 2 ...

это как мат. дерево


ЗЫ в векторе только позитивные цифры

Автор: dorogoyIV 23.1.2009, 19:06
найти два числа не сложно:
Код

import java.util.*;

public class FindNumbers
{
 static Vector <Integer> v = new Vector <Integer> ();
 static int N = 11; // какое то число

 public FindNumbers()
 {
  v.add(6);
  v.add(4);
  v.add(7);
  v.add(5);
  v.add(3);

  Collections.sort(v);
 }

 public static void main(String [] args)
 {
  new FindNumbers();

  int pos = 0;

  for(int i = 0; i < v.size(); i++)
  {
   int first = v.get(pos);

   for(int j = pos + 1; j < v.size(); j++)
   {
    int second = v.get(j);

    if((first + second) == N)
     System.out.println(first + " + " + second + " = " + N);
   }
   pos++;
  }
 }
}

что бы найти больше двух чисел - обдумываю несколько вариантов поиска  smile 

Автор: AndrewMormysh 23.1.2009, 19:57
причем здесь Java?

Автор: VitaL 24.1.2009, 00:13
алгоритм должен быть рекурсивным  smile 

написанный на яве вот при чёт тут ява...

Автор: dorogoyIV 24.1.2009, 01:24
Цитата(VitaL @  24.1.2009,  00:13 Найти цитируемый пост)
алгоритм должен быть рекурсивным   

ну это понятно... просто выходные, и мой Орган из двух букв плохо соображает под воздействием паров алкоголя.
если никто не подскажет, то после выходных постараюсь отписаться (если время будет, потерпишь?).  smile 

по крайней мере мой код не пропускает варианты, в отличие от твоего  smile 

Автор: ivg 24.1.2009, 07:43
Код

import java.util.*;

public class Test {

    static final int ARRAY_LENGTH = 10;
    static final int MAX_NUMBER = 32;

    static int[] extract(int[] src, BitSet which) {
        int res[] = new int[which.cardinality()];
        for (int i = 0, j = 0; i < src.length; ++i) {
            if (which.get(i))
                res[j++] = src[i];
        }
        return res;
    }

    static void reqSearch(int test, int[] src, int fIndex, BitSet res,
            List<BitSet> results) {
        int sub = test - src[fIndex];
        if (sub == 0) {
            BitSet clon = (BitSet) res.clone();
            clon.set(fIndex);
            results.add(clon);
        }
        if (++fIndex < src.length) {
            res.set(fIndex - 1);
            reqSearch(sub, src, fIndex, res, results);
            res.clear(fIndex - 1);
            reqSearch(test, src, fIndex, res, results);
        }
    }

    public static void main(String[] args) throws Exception {
        List<BitSet> results = new ArrayList<BitSet>();
        int[] array = new int[ARRAY_LENGTH];
        int sum = 0;
        Random rnd = new Random();
        for (int i = 0; i < array.length; ++i) {
            array[i] = rnd.nextInt(MAX_NUMBER);
            sum += array[i];
        }
        sum = sum * 3 / 4;
        System.out.println("Array:" + Arrays.toString(array));
        System.out.println("sum = " + sum);
        long t1 = System.nanoTime();
        reqSearch(sum, array, 0, new BitSet(array.length), results);
        long t2 = System.nanoTime();
        System.out.println("Results:");
        for (BitSet res : results) {
            System.out.println(Arrays.toString(extract(array, res)));
        }
        System.out.println("Search time: " + (double) (t2 - t1) / 1000 + " mks");
    }
}

Автор: dorogoyIV 24.1.2009, 12:05
ivg, Random тут как прописался? для чего он? по моему он тут ни к селу ни к городу  smile 

Автор: ivg 24.1.2009, 15:37
Цитата(dorogoyIV @  24.1.2009,  14:05 Найти цитируемый пост)
ivg, Random тут как прописался? для чего он? по моему он тут ни к селу ни к городу

Для задания содержимого исходного массива. Улучшаем навыки чтения чужих неоткомментированных исходников. smile

Автор: VitaL 24.1.2009, 20:46
ivg, ого, работает, только ниииипоняяяяяяяяяятно  smile  smile буду разбираться что к чему, спасибо!  smile   smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)