Hỏi về cách dùng 1 vòng lặp duyệt mảng 2 chiều

Đối với người biết cách dùng 1 vòng lặp duyệt mảng 2 chiều.

Mọi người cho em hỏi về cái này ạ, em mới nghe lần đầu.

Cách này làm thế nào ? Nhanh hay chậm hơn so với cách dùng 2 vòng lặp? Nên dùng cách này hay cách cũ (vì trước giờ em chưa thấy ai nói hay làm kiểu này).

Cám ơn mọi người ạ

làm được, nhưng không nên làm, vì nó hại não :grin:

1 Like

Em có thể dùng 1 vòng lặp bằng cách tính chỉ số của nó theo thứ tự duyệt:
Giả sử mảng kích thước m*n
mang[i][j] <=> thứ tự = i*n+j

duyệt bằng 1 vòng for:

for (k =0;k< m*n;++k){
     i=k/n;
     j=k%n;
}
2 Likes

Confirm là không ai “rảnh” làm như thế này nhé.

#include <stdio.h>

int main()
{
        int arr[3][3] = {
                {1, 2, 3},
                {4, 5, 6},
                {7, 8, 9}
        };

        // Print value using double for loop
        for(int i = 0; i < 3; ++i) {
                for(int j = 0; j < 3; ++j) {
                        printf("%d ", arr[i][j]);
                }
                printf("\n");
        }

        // Print address using double for loop
        for(int i = 0; i < 3; ++i) {
                for(int j = 0; j < 3; ++j) {
                        printf("%p ", &arr[i][j]);
                }
                printf("\n");
        }

        // Print value using single for loop
        int *pa = arr;
        for(int i = 0; i < 3*3; ++i) {
                printf("%d ", *(pa+i));
                if ( (i + 1) % 3 == 0 )
                        printf("\n");
        }

        // Print address using print address
        for(int i = 0; i < 3*3; ++i) {
                printf("%p ", pa+i);
                if ( (i + 1) % 3 == 0 )
                        printf("\n");
        }
}
1 Like

Là sao anh, em không hiểu ý anh nói.

Ý là anh viết chương trình mẫu sử dụng một vòng lặp để lặp qua mảng 2 chiều rồi đấy, em xem thử đi.

Nhưng mà không có ai làm như vậy cả. Chương trình anh viết chỉ là demo thôi

Vậy mình có nên dùng cách đó không anh, và cách đó có tối ưu hơn (chạy nhanh hơn) cách 2 vòng lặp không ?

Không tối ưu hơn đâu @nhatlonggunz

Mà code phức tạp, nhiều khả năng gây ra lỗi.

1 Like

Cách tối ưu thì được mọi người dùng nhiều, vậy cách dùng 1 vòng lặp có tối ưu không :smile:

Người ta chỉ sử dụng mảng 1 chiều thay cho mảng 2 chiều và có thể dùng 1 vòng for duyệt hết cả mảng. Ví dụ đơn giản để tạo mảng 1 chiều mà sử dụng như mảng 2 chiều như thế này.

#include<iostream>
using namespace std;

// bien 
extern int const ROWS = 2;
extern int const COLS = 2;    
extern int const MATRIX[ROWS*COLS] = { 1 , 2 , 3, 4}; // thay cho mang 2x2    

// lay gia tri cua matrix theo hang va cot    
int matrix(int row, int col)
{
    assert(row >= 0 && row < ROWS);
    assert(col >= 0 && col < COLS);
    
    return MATRIX[(row*COLS) + col];    
}



int main()
{
    cout<<"matrix[0][0] = "<<matrix(0,0)<<endl;
    cout<<"matrix[0][1] = "<<matrix(0,1)<<endl;
    cout<<"matrix[1][0] = "<<matrix(1,0)<<endl;
    cout<<"matrix[1][1] = "<<matrix(1,1)<<endl;
    
    return 0;
}

cái này trước làm mảng động 2 chiều dùng con trỏ e từng làm nè, nhưng thầy giáo hướng dẫn lại cách chạy 2 vòng for. thật ra thì 2 vòng này như nhau, đều có độ phức tạp o(n^2) nhỉ.

1 Like

Cho em hỏi cái trên ý nghĩa là gì ạ :slight_smile:

Là 2 vòng for, dùng từ double, có nghĩa là đôi, ý muốn nói 2 vòng for đi đôi với nhau (hay ta gọi là lồng nhau)

1 Like

em cũng đang băng khoăn nên em có viết 1 bài anh dành thời gian xem được không cảm ơn anh
http://daynhauhoc.com/t/cach-nhanh-co-that-su-nhanh-trong-sap-xep-mang-2-chieu/4293

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?