Porownanie kazdego elementu tablicy z inna.

0

Witam nie mogę wpaść na pomysł jak porównać dwie tablice ze sobą czy nie maja tego samego elementu . Czyli jeśli jedna tablica ma rozmiar 6 i druga ma taki sam rozmiar . (To bedzie 36 porownan bo kazdy element z kazdym )

W tym wypadku sprawdzam np 1 element tablicy z 1 elementem drugiej tablicy, a gdybym chciał wszystkie ? np 1 z 3 ? 2 z 5 ? itd

 
for(int i = 0 ; i < n ; i++)
{
 if(tab[i]==tab[j]) instrukcja
}
1

Jeżeli chcesz porównać każdy element tablicy A z każdym tablicy B, to najprościej użyć 2 zagnieżdżonych pętli.
Pierwsza leci po wszystkich elementach tablicy A, druga dla każdego elementu z A leci przez tablicę B:

for (int i = 0; i < tabASize; i++)
{
	for (int j = 0; j < tabBSize; j++)
	{
		if (tabA[i] == tabB[j]) instrukcja;
	}
}

albo lepiej przy użyciu C++11:

for (int x : tabA)
{
	for (int y : tabB)
	{
		if (y == x) instrukcja;
	}
}
2
#include <algorithm>
#include <iostream>

using namespace std;

int main(void) {
    int table1[] = { 3, 5, 1, 2, 4, 7 };
    int table2[] = { 8, 9, 11, 1, 14, 33 };

    auto it = find_first_of(begin(table1), end(table1), begin(table2), end(table2));

    if(it == end(table1)) {
        cout << "Nie znaleziono takiego samego elementu w obu tablicach" << endl;
    } else {
        cout << "Znaleziono element o wartości " << *it << " w pierwszej tablicy." << endl;
    }
}
  1. Jeśli masz wyjście to nie upieraj się na tablicę (lepiej vector)
  2. Usilnie radzę dokładnie przejrzeć nagłówek algorithm. Tam są rozwiązania (prawie) wszystkich tego typu problemów.
  3. Jak chcesz szukać następnych powtórzonych elementów to można także tak:
#include <algorithm>
#include <iostream>

using namespace std;

int main(void) {
    int table1[] = { 3, 5, 1, 2, 4, 7 };
    int table2[] = { 8, 9, 11, 1, 14, 2 };

    auto it = find_first_of(begin(table1), end(table1), begin(table2), end(table2));

    while(it != end(table1)) {
        cout << "Znaleziono element o wartości " << *it << " w pierwszej tablicy." << endl;
        it = find_first_of(++it, end(table1), begin(table2), end(table2));
    }
}

Oczywiście kompilować C++11 :-)

3

http://ideone.com/hhc58G
algorytm jest chyba zrozumiały. Działa w czasie O(n*log2(n)) i nie wiem, czy da sie szybciej. Chociaż problem sam w sobie jest bardzo ciekawy.

EDIT:
http://ideone.com/0Mbcr5
jednak da sie liniowo.

EDIT2:
można też użyć tego przed użyciem unordered_map: https://pl.wikipedia.org/wiki/Filtr_Blooma

3

Dlaczego nie użyć po prostu std::set_intersection? http://en.cppreference.com/w/cpp/algorithm/set_intersection

int main()
{
	vector<int> v1 = { 3, 5, 1, 2, 4, 7 };
	vector<int> v2 = { 8, 9, 11, 1, 14, 2 };

	vector<int> res;

	sort(v1.begin(), v1.end());
	sort(v2.begin(), v2.end());

	set_intersection(v1.cbegin(), v1.cend(), v2.cbegin(), v2.cend(), back_inserter(res));

	DBG(res.size() > 0);
	DBG_CONT(res);
}

http://melpon.org/wandbox/permlink/iwoyPvo7Qlxp3JBL

Jeśli ilość powtórzeń jest problemem to można napisać własny pseudoiterator.

0

A gdybym chciał sprawdzić czy w ** Jednej** tablicy nie powtórzyła się czasem jakaś liczba? (załóżmy że tablica inicjowana jest losowymi wartościami i się tak zdarzylo, ze sie powtorzyly liczby ) . Wiedziałbym jak zrobić by sprawdzić czy poprzedni element jest różny od następnego ale np 1 element tablicy z 3 elementem tej tablicy już nie wiem. (Na tablicach)

1

Dla posortowanej tablicy: http://en.cppreference.com/w/cpp/algorithm/adjacent_find

Ewentualnie możesz skopiować elementy do kontenera trzymającego unikatowe wartości (set/unordered_set) i porównać ich wielkość.

	vector<int> v1 = { 1, 2, 3, 4, 4, 5, 6};
	vector<int> v2 = { 1, 2, 3, 4, 5, 6, 7};

	auto v1It = adjacent_find(v1.cbegin(), v1.cend());
	auto v2It = adjacent_find(v2.cbegin(), v2.cend());

	DBG(v1It == v1.cend());
	DBG(*v1It);
	DBG(v2It == v2.cend());


	set<int> s1(v1.cbegin(), v1.cend());
	set<int> s2(v2.cbegin(), v2.cend());

	DBG(s1.size() == v1.size());
	DBG(s2.size() == v2.size());

http://melpon.org/wandbox/permlink/ah6stedp0FKTeiTb

0

Czy ktos wie dlaczego w tym kodzie nadal sie powtarzaja liczby?
http://screenshot.sh/mMhp16wXigp8u

#include <iostream>
#include <cstdlib>
#include <time.h>
#include <windows.h>
using namespace std;

int main()
{
    cout << "Losowanie 6 liczb bez powtorzen" << endl;
    int* tab = new int [6];
    //int tab[5];
    int liczba ;
    int k = 0;
    srand(time(NULL));
for(int i = 0 ; i < 6 ;)
    {
liczba = rand()%49+1;  // Przypisanie losowej liczby z zakresu od 1 do 49
        if(liczba == tab[i])
        {
            ;                       // Jesli sie powtorzy to nic sie nie wykona
        }
        else                              // Jesli sie nie powtorzyla to przepisuje do tablicy, a i +1
        {
            tab[k]=liczba;
            i++;
            k++;
        }
    }
    for(int i = 0 ; i < 6 ; i++)
    {
        cout << tab[i] << "\t";
    }
    return 0;
}

 
1

Bo porównujesz z niezainicjalizowanymi danymi z tab.

Cały kod jest generalnie do poprawy.

  1. nagie new (i to do tego bez delete). Możesz użyć std::vector albo nawet zwykłej sześcioelementowej tablicy w tym przypadku. Albo jeszcze lepiej std::set.
  2. srand i rand - używaj <random>. Dużo przyjemniej i bezpieczniej.
  3. Nawet jeśli być nie porównywał z niezainicjalizowanymi zmiennymi to nie patrzysz na wszystkie poprzednio znalezione liczby. Jak więc masz sprawdzić czy jest powtórka, jeśli nie sprawdzasz?
  4. tragiczne formatowanie. Polecam http://format.krzaq.cc
0
#include <iostream>
#include <set>
#include <vector>

void verifyDuplicates(std::vector<int> const& v);

int main()
{
    std::vector<int> v { 1, 2, 3, 4, 5 };
    std::vector<int> v1 { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
    verifyDuplicates(v);
    verifyDuplicates(v1);
    
    return 0;
}

void verifyDuplicates(std::vector<int> const& v)
{
    static std::set<int> s;
    for(auto e : v) {
        auto result = s.insert(e);
        if(!result.second) {
            std::cout << "Warning duplicated value -> " << *(result.first) << std::endl;
        }
    }
}

http://melpon.org/wandbox/permlink/45khScNH1ee8SivU

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