So sánh các phần tử trong 2 mảng

Cho 2 mảng số nguyên A và có có n và m phần tử. Mỗi phần tử là duy nhất trong 2 mảng A và B. Tìm phần giao của 2 mảng. n, m > 0

Ví dụ

Input: A[] = {1, 3, 5, 7, 8, 2}, B = {3, 4, 0, 2}
Output: 3, 2

Cách 1: Sử dụng vòng lặp

public class Main { public static void printUnion[int[] A, int[] B, int n, int m] { for [int i = 0; i < n; i++] { for [int j = 0; j < m; j++] { if [A[i] == B[j]] System.out.print[A[i] + " "]; } } } public static void main[String[] args] { int[] A = {1, 3, 5, 7, 8, 2}; int[] B = {3, 4, 0 , 2}; printUnion[A, B, A.length, B.length]; } }

Output: 3, 2

Độ phức tạp: O[n2]

Cách 2: Sắp xếp

B1: Sắp xếp A và BB2: Khởi tạo index_a = 0, index_b = 0B3: Trong khi index_a < n và index_b < m, với mỗi A[index_a] và B[index_b]       1. if A[index_a] == B[index_b]          index_a++          index_b++          xuất A[index_a] hoặc B[index_b]       2. else if A[index_a] > B[index_b] thì index_b++       3. else index_a++
import java.util.Arrays; public class Main { public static void printUnionSort[int[] A, int[] B, int n, int m] { Arrays.sort[A]; Arrays.sort[B]; int index_a = 0, index_b = 0; while [index_a < n && index_b < m] { if [A[index_a] == B[index_b]] { System.out.print[A[index_a] + " "]; index_a++; index_b++; } else if [A[index_a] > A[index_b]] index_b++; else index_a++; } } public static void main[String[] args] { int[] A = {1, 3, 5, 7, 8, 2}; int[] B = {3, 4, 0, 2}; printUnionSort[A, B, A.length, B.length]; } }

Output: 2, 3

Độ phức tạp: O[nlogn]

Link đề bài: //www.geeksforgeeks.org/union-and-intersection-of-two-sorted-arrays-2/

Would love your thoughts, please comment.x

mn cho em hỏi code so sánh 5 phần tử trong mảng này sai ở đâu với ạ
lúc chạy chương trình nó cứ ra số ngẫu nhiên =.=

#include using namespace std; int main[] { int s[5]; int max; cout item2].ToArray[]; var result2 = Enumerable.From[array2].FindNewItems[array1, item2 => item2, item1 => item1].ToArray[]; var result0 = Enumerable.From[array1].Join[array2, item1 => item1, item2 => item2, [item1, item2] => item1].ToArray[];

Không khác gì với C#, tôi cũng chỉ mất có 3 dòng lệnh để so sánh 2 mảng bằng Javascript

Trong thực tế phần mềm của tôi rất hay dùng tới việc so sánh này. Cụ thể là tôi thường phải lưu trữ một danh sách bản ghi vào DataBase. Ví dụ như danh sách chi tiết các sản phẩm của một đơn hàng. Lúc lưu trữ tôi sẽ so sánh danh sách chi tiết khách hàng đang nhập ở giao diện với danh sách đã có trong DataBase. Từ đó sẽ tìm ra bản ghi nào cần: 

  • 1. Thêm mới: Khách hàng thêm bản ghi trên giao diện. Như vậy so với trong DataBase là những bản ghi mới.
  • 2. Xóa: Khách hàng xóa bỏ bản ghi. Như vậy so với DataBase là đã bị gỡ bỏ
  • 3. Cập nhật: Chỉ việc Join để tìm bản ghi cần sửa

Đây chính là màn hình đơn hàng trong phần mềm của tôi

Như đã nói ở tiêu đề là tôi hoàn toàn không dùng vòng lặp. Nhưng mà tôi chắc chắn rằng sẽ có các bạn bình luận rằng ở trong cái Linq thì lại chả có cả đống vòng for, while 

. Các bạn phải đọc rõ tiêu đề là tôi không dùng for, while còn Linq nó dùng thì tôi ko quan tâm. Cũng giống như tôi chia sẻ bài viết Code mô phỏng đèn tín hiệu giao thông bằng javascript là tôi không dùng if, else mà các bạn cứ vào comment là thư viện tôi dùng thì lại chả có if 

Nói vậy thôi, anh em comment thế nào cũng được. Miễn là chúng ta cùng chia sẻ và học hỏi thôi. Chúc các bạn cuối tuần vui vẻ

Sơn 20

Cùng tìm hiểu về cách so sánh mảng trong C. Bạn sẽ học được cách so sánh 2 mảng trong c sau bài học này.

Có 2 phương pháp so sánh 2 mảng trong C như sau:

  • So sánh 2 mảng trong C bằng cách đối chiếu từng cặp phần tử
  • So sánh 2 mảng trong C bằng hàm memcmp

Lại nữa, các phương pháp này được dùng để so sánh mảng số trong C. Để so sánh 2 mảng chuỗi, bạn có thể tham khảo bài viết sau:

  • Xem thêm: So sánh chuỗi trong C [strcmp, strncmp]

Logic so sánh mảng trong C

Để so sánh 2 mảng trong C, điều kiện đầu tiên là 2 mảng đó cần phải có kiểu dữ liệu giống nhau. Ví dụ chúng ta có thể so sánh một mảng có kiểu int với một mảng khác có cùng kiểu int, nhưng lại không thể so sánh với một mảng khác nữa có kiểu float chẳng hạn.

Khác với khi so sánh 2 số, bạn không thể sử dụng các toán tử so sánh như = hay != với mảng trong C được. Nếu chúng ta sử dụng các toán tử so sánh để so sánh mảng, thì kết quả trả về sẽ không được như mong đợi như sau:



int main[void]
{
int array1[] = {0, 1, 2, 3, 4};
int array2[] = {0, 1, 4};
int array3[] = {0, 1, 2, 3, 4};
int array4[] = {0, 1, 2, 3, 4, 5};

printf["%d\n", array1 == array1];
printf["%d\n", array1 == array2];
printf["%d\n", array1 == array3];
printf["%d\n", array1 == array4];

return 0;
}

Kết quả:

Có thể thấy trong phép so sánh thứ 3 đã không đưa ra được kết quả chính xác.

Để so sánh mảng trong C, chúng ta không thể so sánh trực tiếp chúng như trên, mà cần phải so sánh từng cặp phần tử của chúng tại cùng vị trí index với nhau, hoặc là chuyển các mảng này sang dạng con trỏ của mảng, rồi tiến hành so sánh địa chỉ [address] của chúng trong bộ nhớ, với một trong 2 phương pháp mà Kiyoshi sẽ trình bày ở dưới đây.

So sánh mảng trong C bằng cách đối chiếu từng cặp phần tử

Cách đầu tiên và đơn giản, dễ hiểu nhất để so sánh mảng trong C, đó chính là đối chiếu và kiểm tra từng cặp phần tử trong 2 mảng với nhau.

Nếu tất cả các cặp phần tử với vị trí tương ứng trong 2 mảng đều giống nhau thì hai mảng đó là bằng nhau. Ngược lại chỉ cần tồn tại một cặp phần tử có giá trị khác nhau, điều đó có nghĩa là 2 mảng đã cho không giống nhau.

Chúng ta sẽ sử dụng tới vòng lặp for với từng cặp phần tử và viết hàm trong chương trình so sánh mảng trong C như sau:










int array_equal[const int* array1, size_t size1, const int* array2, size_t size2]{



int flag = 1;


assert[array1 != NULL];
assert[array2 != NULL];
assert[size1 != 0];
assert[size2 != 0];


if [size1 != size2] return flag = 0;



for [size_t i = 0; i < size1; ++i] {
if [array1[i] != array2[i]] return flag = 0;

}
return flag;
}

int main[void]
{
int array1[] = {0, 1, 2, 3, 4};
int array2[] = {0, 1, 4};
int array3[] = {0, 1, 2, 3, 4};
int array4[] = {0, 1, 2, 3, 4, 5};

printf["%d\n", array_equal[array1, SIZE_OF_ARRAY[array1], array1, SIZE_OF_ARRAY[array1]]];
printf["%d\n", array_equal[array1, SIZE_OF_ARRAY[array1], array2, SIZE_OF_ARRAY[array2]]];
printf["%d\n", array_equal[array1, SIZE_OF_ARRAY[array1], array3, SIZE_OF_ARRAY[array3]]];
printf["%d\n", array_equal[array1, SIZE_OF_ARRAY[array1], array4, SIZE_OF_ARRAY[array4]]];

return 0;
}

Kết quả phép so sánh mảng trong C:

So sánh mảng trong C bằng hàm memcmp

Ngoài cách so sánh từng cặp phần tử trong 2 mảng như trên, chúng ta cũng có thể sử dụng hàm có sẵn memcmp để so sánh 2 mảng trong C.

Hàm memcmp là một hàm trong header file string.h, vốn được sử dụng để so sánh nội dung của các vùng trên bộ nhớ với nhau. Ứng dụng hàm này, chúng ta có thể so sánh các vùng trên bộ nhớ được sử dụng để chứa các mảng, và qua đó có thể so sánh gián tiếp mảng trong C.

Chúng ta sử dụng hàm memcmp với cú pháp sau đây:

int memcmp[const void* s1, const void* s2, size_t size];

Trong đó:

  • s1, s2 là tên hai mảng cần so sánh, và chúng ta không chỉ định trực tiếp 2 mảng này trong đối số của hàm, mà sẽ sử dụng con trỏ mảng của chúng.
  • size là phạm vi so sánh trên bộ nhớ [byte]. Lưu ý đây là phạm vi tính bởi byte chứ không phải là số phần tử trong mảng đâu nhé.

Hàm memcmp thường được sử dụng để so sánh quan hệ lớn nhỏ giữa 2 vùng trong bộ nhớ, tuy nhiên bằng cách kiểm tra giá trị trả về của nó là 0 hay là một số khác 0 thì chúng ta cũng có thể so sánh xem 2 mảng trong C có giống nhau hay không.

Và chúng ta viết chương trình so sánh 2 mảng trong C bằng hàm memcmp như sau:









bool array_equal[const int* array1, size_t size1, const int* array2, size_t size2]
{
assert[array1 != NULL];
assert[array2 != NULL];
assert[size1 != 0];
assert[size2 != 0];


if [size1 != size2] {
return false;
}


return memcmp[array1, array2, size1 * sizeof[int]] == 0;
}

int main[void]
{
int array1[] = {0, 1, 2, 3, 4};
int array2[] = {0, 1, 4};
int array3[] = {0, 1, 2, 3, 4};
int array4[] = {0, 1, 2, 3, 4, 5};

printf["%d\n", array_equal[array1, SIZE_OF_ARRAY[array1], array1, SIZE_OF_ARRAY[array1]]];
printf["%d\n", array_equal[array1, SIZE_OF_ARRAY[array1], array2, SIZE_OF_ARRAY[array2]]];
printf["%d\n", array_equal[array1, SIZE_OF_ARRAY[array1], array3, SIZE_OF_ARRAY[array3]]];
printf["%d\n", array_equal[array1, SIZE_OF_ARRAY[array1], array4, SIZE_OF_ARRAY[array4]]];

return 0;
}

Kết quả phép so sánh mảng trong C:

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn cách so sánh mảng trong C rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C trong các bài học tiếp theo.

Video liên quan

Chủ Đề