Sở dĩ tôi nghi ngờ là vì chợt nghĩ ra một tình huống thế này:
- Trên sheet có 20000 shape
- Điều hiển nhiên là Excel sẽ gán cho 1 shape nào đó là giá trị Index =1 và 1 cái nào đó là giá trị Index = 20000
- Bây giờ nếu tôi xóa bằng tay Shape mang index =1 thì hóa ra nó sẽ "chậm" hơn so với khi tôi xóa thằng shape mang index = 20000 (theo suy luận của bạn)
Tôi thì lại cảm thấy nó vô lý vô cùng ấy chứ ???!!!
Xin lỗi, vì tôi chỉ học mò nên cũng nói theo kiểu mò và dùng thực nghiệm để kiểm chứng thôi
Vấn đề nằm ở lý thuyết cấu trúc dữ liệu.
Shapes là một collection. Hàm Shapes(i) là một hàm dùng chỉ số i để lấy về phần tử ở vị trí i của collection này.
Cái mà tôi chưa nắm vững là Excel/VBA dùng kỹ thuật nào để lập cấu trúc dữ liệu cho cái shapes collection.
1. Nếu collection này diễn theo dạng array thì:
- Collection chứa địa chỉ đầu mảng.
- Khi xoá phần tử đầu, các phần tử khác sẽ được đôn lên. Vì vậy tốn năng lượng. Tuy nhiên,
2. Nếu collection này diễn theo dang danh sách liên kết thì:
- Con trỏ collection trỏ vào phần tử đầu danh sách.
- Khi xoá phần tử đầu, collection chỉ việc mò đến phần tử kế tiếp, dời con trỏ vào đấy và vứt bỏ phần tử đàu tiên.
- Khi xoá phần tử cuối, collection phải mò từ đầu đến cuối để vứt bó phần tử cuối. Vì vậy ngược lại cách này lại tốn năng lượng hơn cách xoá phần tử đầu.
3. Nếu diễn theo kỹ thuật khác: chưa biết. Nhưng
nếu là kỹ thuật bảng tra thì ý của bạn là đúng.
Chú thích cho những bạn ít có tiếp xúc với cơ cấu dữ liệu:
Đối với array, các phần tử được xếp liên tục nhau trong bộ nhớ. Hàm (), tức là hàm dùng chỉ số để tìm phần tử, sử dụng con toán nhân trực tiếp (nhân chỉ số với số bytes của loại dữ liệu) để biết offset giữa phần tử này và phần tử đầu mảng.
Đối với danh sách liên kết hay liinked list, các phần từ không được xếp liên tục nhau trong bộ nhớ. Chúng liên hệ với nhau bằng cách mỗi phần tử (gọi là nút) chứa một con trỏ cho biết địa chỉ của phần tử kế nó. DSLK chỉ cần biết địa chỉ phần tử đầu tiên. Vì vậy DSLK không có con toán trực tiếp liên hệ giữa chỉ số và địa chỉ phần tử. Hàm () phải phăng từ phần tử đầu tiên cho đến phần tử cần kiếm.
Đối với bảng tra (indexed table), các phần tử cũng không liên tục nhau trong bộ nhớ. Hệ thống dùng một bảng tra (thường là bảng b-tree) để chứa địa chỉ từng phần tử. Đối với loại này, năng lượng xoá phần tử liên hệ trực tiếp đến sự cân bằng của bảng tra chứ không quan hệ mấy với vị trí phần tử.