Hướng dẫn map vs array performance c++ - bản đồ so với hiệu suất mảng c ++

Tôi phải lặp qua một tập hợp các phần tử trong một mảng lớn trong đó mỗi phần tử chỉ đến một phần khác (vấn đề đến từ việc phát hiện thành phần được kết nối trong một biểu đồ lớn).

Algo của tôi sẽ diễn ra như sau: 1. Xem xét phần tử thứ nhất 2. Hãy xem xét phần tử tiếp theo là phần được chỉ ra bởi phần tử trước đó. 3. Vòng lặp cho đến khi không có phần tử mới nào được khám phá 4. Xem xét phần tử tiếp theo chưa xem xét trong 1-3, hãy quay lại 1. Lưu ý rằng số lượng phần tử cần xem xét nhỏ hơn nhiều so với tổng số phần tử.

Đối với những gì tôi thấy bây giờ, tôi có thể:

//create a map of all element, init all values to 0, set to 1 when consider
map is_set; // is_set.size() will be equal to N

hoặc

//create a (too) large array (total size), init to 0 the elements to consider
int* is_set = (int*)malloc(total_size * sizeof(int)); // is_set length will be total_size>>N

Tôi biết rằng việc truy cập các phím trong bản đồ là O (log n) trong khi nó chỉ không đổi cho các mảng, nhưng tôi không biết liệu malloc không tốn kém hơn trong việc tạo ra trong khi nó cũng đòi hỏi nhiều bộ nhớ hơn?

Hướng dẫn map vs array performance c++ - bản đồ so với hiệu suất mảng c ++

Khi được hỏi ngày 3 tháng 5 năm 2012 lúc 16:41May 3, 2012 at 16:41

6

Khi nghi ngờ, đo lường hiệu suất của cả hai lựa chọn thay thế. Đó là cách duy nhất để biết chắc chắn phương pháp nào sẽ nhanh nhất cho ứng dụng của bạn. That's the only way to know for sure which approach will be fastest for your application.

Điều đó nói rằng, một malloc lớn một lần thường không đắt đỏ. Ngoài ra, mặc dù bản đồ là O (log n), nhưng Big-O che giấu một yếu tố không đổi tương đối lớn, ít nhất là đối với việc triển khai std::map, theo kinh nghiệm của tôi. Tôi sẽ không ngạc nhiên khi thấy rằng phương pháp mảng nhanh hơn trong trường hợp này, nhưng một lần nữa, cách duy nhất để biết chắc chắn là đo lường.

Hãy nhớ rằng mặc dù bản đồ không có phân bổ bộ nhớ lớn phía trước, nhưng nó có nhiều phân bổ nhỏ trong suốt vòng đời của đối tượng (mỗi khi bạn chèn một yếu tố mới, bạn sẽ nhận được một phân bổ khác và mỗi khi bạn xóa một yếu tố, bạn nhận được một miễn phí khác). Nếu bạn có rất nhiều trong số này, điều đó có thể phân mảnh đống của bạn, điều này có thể ảnh hưởng tiêu cực đến hiệu suất tùy thuộc vào những gì ứng dụng của bạn có thể làm cùng một lúc.

Đã trả lời ngày 3 tháng 5 năm 2012 lúc 16:46May 3, 2012 at 16:46

Hướng dẫn map vs array performance c++ - bản đồ so với hiệu suất mảng c ++

Eric Melskieric MelskiEric Melski

15.9k3 Huy hiệu vàng36 Huy hiệu bạc 50 Huy hiệu Đồng3 gold badges36 silver badges50 bronze badges

2

Nếu tìm kiếm được lập chỉ mục phù hợp với nhu cầu của bạn (như được cung cấp bởi các mảng kiểu C thông thường), có lẽ std::map không phải là lớp phù hợp với bạn. Thay vào đó, hãy xem xét sử dụng std::vector nếu bạn cần phân bổ thời gian chạy động hoặc std::array nếu bộ sưu tập của bạn có kích thước cố định và bạn chỉ cần thay thế an toàn giới hạn nhanh nhất cho con trỏ kiểu C.

Bạn có thể tìm thêm thông tin về bài viết trước này.

Đã trả lời ngày 3 tháng 5 năm 2012 lúc 17:07May 3, 2012 at 17:07

Gerardo Limagerardo LimaGerardo Lima

6.2843 Huy hiệu vàng30 Huy hiệu bạc47 Huy hiệu đồng3 gold badges30 silver badges47 bronze badges

1

Tôi biết rằng việc truy cập các phím trong bản đồ là O (log n) trong khi nó chỉ không đổi cho các mảng, nhưng tôi không biết liệu malloc không tốn kém hơn trong việc tạo ra trong khi nó cũng đòi hỏi nhiều bộ nhớ hơn?

Khi được hỏi ngày 3 tháng 5 năm 2012 lúc 16:41

Khi nghi ngờ, đo lường hiệu suất của cả hai lựa chọn thay thế. Đó là cách duy nhất để biết chắc chắn phương pháp nào sẽ nhanh nhất cho ứng dụng của bạn.

Điều đó nói rằng, một malloc lớn một lần thường không đắt đỏ. Ngoài ra, mặc dù bản đồ là O (log n), nhưng Big-O che giấu một yếu tố không đổi tương đối lớn, ít nhất là đối với việc triển khai std::map, theo kinh nghiệm của tôi. Tôi sẽ không ngạc nhiên khi thấy rằng phương pháp mảng nhanh hơn trong trường hợp này, nhưng một lần nữa, cách duy nhất để biết chắc chắn là đo lường.May 3, 2012 at 16:47

2

Bản đồ có nhận được nhanh hơn mảng tìm thấy không?

FindIndex là O (N) trong khi bản đồ.Nhận là O (1), có nghĩa đơn giản là Map.get hiệu quả hơn.map. get is more efficient.

Bản đồ có tốt hơn mảng không?

Bản đồ có thể sử dụng được trong khi một mảng, như được đưa ra trong câu hỏi, cũng có thể hiểu được, một bản đồ cung cấp một trường hợp sử dụng tốt hơn cho các ánh xạ quan trọng hơn so với một đối tượng.Có thể hiểu được có một số lợi ích, thực hiện đúng lúc và lệnh được đảm bảo là hai ví dụ.a Map offers a better use-case for key-value mappings than an Object would. Being iterable has a number of benefits, just-in-time execution and guaranteed order being two examples.

Là một mảng nhanh hơn một hashmap?

Theo một bài đăng Stackoverflow, "HashMap sử dụng một mảng bên dưới để nó không bao giờ có thể nhanh hơn sử dụng một mảng một cách chính xác".HashMap uses an array underneath so it can never be faster than using an array correctly".

Bản đồ có nhanh hơn thiết lập không?

Giải pháp MAP dẫn đến "Giới hạn thời gian vượt quá trên thử nghiệm 3", trong khi giải pháp được đặt dẫn đến "Giới hạn thời gian vượt quá trên thử nghiệm 2", điều đó có nghĩa là thử nghiệm 2 sao cho giải pháp MAP hoạt động nhanh hơn so với giải pháp đã đặt.Test 2 is such that the map solution works faster on it than the set solution.