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?
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
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