File Excel khi làm rất nặng (1 người xem)

  • Thread starter Thread starter haiwang
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

haiwang

Thành viên mới
Tham gia
25/2/14
Bài viết
3
Được thích
0
Nhờ mọi người giúp dùm mình có 2 file Exel khi mở ra để làm và trong quá trình làm thì nó rất chậm. Cám ơn nhiều.
 

File đính kèm

Nhờ mọi người giúp dùm mình có 2 file Exel khi mở ra để làm và trong quá trình làm thì nó rất chậm. Cám ơn nhiều.

lỗi trên file đó là do có quá nhiều Objects. (object của bạn là các Textbox ... quá trời --=0, máy mình cũng khá mạnh mà cũng chạy ko nổi cái file đó)

'- - -
nếu là Excel 2013 thì bạn sửa bằng cách (chắc 2007, 2010 cũng tương tự)
Menu Home --> Find&Select --> Selection Pane, bạn sẽ thấy các Textbox đó.
 
Nếu object do virus tạo ra thì có thể dùng code xóa chúng.
 
Nhờ mọi người giúp dùm mình có 2 file Exel khi mở ra để làm và trong quá trình làm thì nó rất chậm. Cám ơn nhiều.

File của bạn chứa trên 50000 "cục đá" nên nó "nặng" là phải rồi
Đã dọn dẹp giúp bạn
 

File đính kèm

File của bạn chứa trên 50000 "cục đá" nên nó "nặng" là phải rồi
Đã dọn dẹp giúp bạn
a tài thật đó, e cố gắng ngồi run cả buổi trưa mà chẳng thấm vào đâu --=0 (chắc do máy của e cùi hơn)

có phải a dùng code để xóa như PTH đã nói ko? cho e xin đoạn code đó với. Thanks a!
 
a tài thật đó, e cố gắng ngồi run cả buổi trưa mà chẳng thấm vào đâu --=0 (chắc do máy của e cùi hơn)

Cái đó chưa chắc đâu. Máy tôi chỉ là con Core2 - 2.2GHz, RAM 2GB ---> Thuộc dạng bèo và tôi không nghĩ cấu hình này có thể hơn máy bạn (vì máy tôi mua lâu rồi)
----------------------------
có phải a dùng code để xóa như PTH đã nói ko? cho e xin đoạn code đó với. Thanks a!
Code mà tôi dùng chỉ có vầy:
Mã:
Sub DelObjects()
  Dim i As Long, wks As Worksheet
  On Error Resume Next
  Set wks = ActiveSheet
  For i = 1 To 10000
    wks.Shapes(1).Delete
  Next
  MsgBox "Còn " & wks.Shapes.Count & " objects"
End Sub
Cứ chạy code đến khi nào nhận được thông báo "Còn 0 objects" thì ngưng
 
Code mà tôi dùng chỉ có vầy:
Mã:
Sub DelObjects()
  Dim i As Long, wks As Worksheet
  On Error Resume Next
  Set wks = ActiveSheet
  For i = 1 To 10000
    wks.Shapes(1).Delete
  Next
  MsgBox "Còn " & wks.Shapes.Count & " objects"
End Sub
Cứ chạy code đến khi nào nhận được thông báo "Còn 0 objects" thì ngưng
Số 10000 trong code có thể thay bởi wks.Shapes.Count thì khỏi phải chạy nhiều lần anh nhỉ.
 
Số 10000 trong code có thể thay bởi wks.Shapes.Count thì khỏi phải chạy nhiều lần anh nhỉ.
Cũng tùy theo máy mạnh thì mình cách này máy yếu nên gắt từng đoạn mà xử giống như bó đũa lấy từng chiếc ra mà bẻ sẽ dễ hơn để nguyên bó anh Phúc? Em thì dùng cách ngắt từng đoạn để đỡ bị treo máy
 
Số 10000 trong code có thể thay bởi wks.Shapes.Count thì khỏi phải chạy nhiều lần anh nhỉ.

Do bác ndu lười thôi --=0, dùng For each là chuẩn nhất:

Mã:
Sub ShapesDelete() 
  Dim Obj As Shape 
  For Each Obj In ActiveSheet.Shapes 
    If Obj.Visible = msoFalse Then 
      Obj.Delete  'Xóa đối tượng Shape bị ẩn, do virus tạo ra 
    End If 
  Next 
  Set Obj = Nothing 
End Sub
 
Do bác ndu lười thôi --=0, dùng For each là chuẩn nhất:

Mã:
Sub ShapesDelete() 
  Dim Obj As Shape 
  For Each Obj In ActiveSheet.Shapes 
    If Obj.Visible = msoFalse Then 
      Obj.Delete  'Xóa đối tượng Shape bị ẩn, do virus tạo ra 
    End If 
  Next 
  Set Obj = Nothing 
End Sub

Số 10000 trong code có thể thay bởi wks.Shapes.Count thì khỏi phải chạy nhiều lần anh nhỉ.

Ẹc... Ẹc... Đó là vì các bạn ít khi đụng đến mấy "cục đá" này nên nghĩ vậy. Nếu mà sửa như Phúc và thầy Hướng, bảo đảm máy đơ luôn
Tóm lại: Phài xóa từ từ và con số 10000 là giới hạn mà tôi thí nghiệm ra (trên mấy tôi)
 
Ẹc... Ẹc... Đó là vì các bạn ít khi đụng đến mấy "cục đá" này nên nghĩ vậy. Nếu mà sửa như Phúc và thầy Hướng, bảo đảm máy đơ luôn
Tóm lại: Phài xóa từ từ và con số 10000 là giới hạn mà tôi thí nghiệm ra (trên mấy tôi)

Đúng rồi. Luật chung của dọn rác đống khổng lồ là dọn từ từ từng vùng một.
Nếu bạn vẫn muốn delete một loạt thì nên làm ngược từ số lớn trở về số nhỏ - với hy vọng tránh được tình trạng index hoặc bộ nhớ bị sắp xếp lại thường xuyên - tôi không chắc có hiệu nghiệm không, nhưng nguyên tắc của delete vẫn là vậy.
 
Ẹc... Ẹc... Đó là vì các bạn ít khi đụng đến mấy "cục đá" này nên nghĩ vậy. Nếu mà sửa như Phúc và thầy Hướng, bảo đảm máy đơ luôn
Tóm lại: Phài xóa từ từ và con số 10000 là giới hạn mà tôi thí nghiệm ra (trên mấy tôi)

Hic, em chưa hiểu lý do máy đơ? Hay với kiểu vòng lặp For each cho tập hợp nhiều Shape thì máy hoạt động kém. Có bạn nào test thử chưa?
 
Hic, em chưa hiểu lý do máy đơ? Hay với kiểu vòng lặp For each cho tập hợp nhiều Shape thì máy hoạt động kém. Có bạn nào test thử chưa?

Máy tôi yếu nên đã đơ từ khi mở tập tin rồi. Vậy không test được, chỉ "võ mồm" thôi.

Dứt khoát là đã Delete tất cả thì làm trong vòng lặp và luôn delete "phần tử cuối". Delete phần tử cuối là đúng bài bản.
Để khỏi phân tích cụ thể thì cứ nghĩ nôm na là nếu ta có 1 hàng học sinh và nếu cứ bỏ từng em đứng cuối thì rồi sẽ hết học sinh. Cũng có thể bỏ từng em thứ 1 nhưng như thế thì sau mỗi lần bỏ thì toàn bộ "hàng hiện hành" phải dịch lên đầu 1 "chỗ".

Tôi tin chắc rằng nếu ai có máy mạnh thì có thể test 2 kiểu delete và theo tôi kiểu luôn delete cuối là nhanh hơn.

Kiểu như
Mã:
Do while wks.Shapes.Count > 0
    wks.Shapes(wks.Shapes.Count).Delete
Loop

Hoặc tốt hơn

Mã:
k = wks.Shapes.Count
Do while k > 0
    wks.Shapes(k).Delete
    k = k - 1
Loop

Tôi không rõ với For Each thì các đối tượng được duyệt theo thứ tự nào. Chắc theo thứ tự tăng dần của chỉ số.
 
Máy tôi yếu nên đã đơ từ khi mở tập tin rồi. Vậy không test được, chỉ "võ mồm" thôi.

Dứt khoát là đã Delete tất cả thì làm trong vòng lặp và luôn delete "phần tử cuối". Delete phần tử cuối là đúng bài bản.
Để khỏi phân tích cụ thể thì cứ nghĩ nôm na là nếu ta có 1 hàng học sinh và nếu cứ bỏ từng em đứng cuối thì rồi sẽ hết học sinh. Cũng có thể bỏ từng em thứ 1 nhưng như thế thì sau mỗi lần bỏ thì toàn bộ "hàng hiện hành" phải dịch lên đầu 1 "chỗ".

Tôi tin chắc rằng nếu ai có máy mạnh thì có thể test 2 kiểu delete và theo tôi kiểu luôn delete cuối là nhanh hơn.

Kiểu như
Mã:
Do while wks.Shapes.Count > 0
    wks.Shapes(wks.Shapes.Count).Delete
Loop

Hoặc tốt hơn

Mã:
k = wks.Shapes.Count
Do while k > 0
    wks.Shapes(k).Delete
    k = k - 1
Loop

Tôi không rõ với For Each thì các đối tượng được duyệt theo thứ tự nào. Chắc theo thứ tự tăng dần của chỉ số.

e đã test code trên
Mã:
Sub Siwtom_Xoa()
k = ActiveSheet.Shapes.Count
Application.ScreenUpdating = False
    Do While k > 0
        ActiveSheet.Shapes(k).Delete
        k = k - 1
        'Tong: 58.559
        If k = 45000 Then MsgBox ("con ") & k
        If k = 40000 Then MsgBox ("con ") & k
        If k = 30000 Then MsgBox ("con ") & k
        If k = 20000 Then MsgBox ("con ") & k
        If k = 10000 Then MsgBox ("con ") & k
        If k = 1000 Then MsgBox ("con ") & k
    Loop
Application.ScreenUpdating = True
End Sub

time:
9h19 -> 9h24 con 40.000
9h24 -> 9h28 con 30.000
9h28 -> 9h32 con 20.000
9h32 -> 9h33 con 10.000
9h33 -> 9h34 con 1000
---> càng về sau xoá càng nhanh
 
Lần chỉnh sửa cuối:
Em cũng bị hiện tượng một số file excel bị tăng dung lượng mặc dù dữ liệu rất ít. Nhờ mọi người giúp đỡ. Em gửi kèm theo một trong số các file đó.
 

File đính kèm

Tôi xóa thử với đoạn code tôi đưa ra thấy ổn (lúc đầu máy hơn đơ 1 chút), khoảng 15 s là xong. Chắc do cấu hình máy mình ngon (core 5, 1.7Ghz). Tiêu diệt hơn 20.000 Shape --=0

 
Em cũng bị hiện tượng một số file excel bị tăng dung lượng mặc dù dữ liệu rất ít. Nhờ mọi người giúp đỡ. Em gửi kèm theo một trong số các file đó.
Tạm thời mình phát hiện file của bạn có nhiều name rác vì đang dùng máy cài office 2003.
Bạn nhấn Ctrl+F3 chọn các name rồi nhấn Delete.
 
Có cách nào nhanh hơn không ạ? Xóa bằng tay từng cái thì rất lâu, mà mình bị nhiều file như thế này.
 
Có cách nào nhanh hơn không ạ? Xóa bằng tay từng cái thì rất lâu, mà mình bị nhiều file như thế này.

name của bạn cũng ko nhiều lắm
26-02-14 10-15-50 AM.jpg

bạn muốn xoá nhanh thì có thể dùng cách sau:

- Sort cột Value (hoặc Refers To)
- chọn từ vị trí 1 + Shift + vị trí 2, rồi Delete là xong.
 
Lần chỉnh sửa cuối:
Có cách nào nhanh hơn không ạ? Xóa bằng tay từng cái thì rất lâu, mà mình bị nhiều file như thế này.
Nếu dùng excel 2007 trở lên thì việc xóa name rác rất đơn giản.
Chỉ cần chọn name rác đầu tiên sau đó nhấn Shift + End rồi nhấn Delete là xong.
to phucbugis và các thành viên : Bạn có biết cách nào xóa hàng loạt name rác trên excel 2003 không?
 
Mình tìm trên này thấy đoạn code này xóa name được:

Sub DeleteErrName()
On Error Resume Next
Dim NSh As Name, i As Integer
Dim OldStatus As Boolean, ThongBao As String
OldStatus = Application.DisplayStatusBar
Sheets.Add.Name = "ShName"
For Each NSh In ActiveWorkbook.Names
If InStr(1, NSh.RefersToR1C1, "#") > 0 Or _
InStr(1, NSh.RefersToR1C1, "\") > 0 Then
i = i + 1
Application.StatusBar = "Deleted : " & Format(i, "#,##0") & _
" Deleting...: " & NSh.Name
Sheets("ShName").Range("A" & i).Value = NSh.Name
Sheets("ShName").Range("B" & i).Value = " " & NSh.RefersToR1C1
NSh.Delete
End If
Next
If i > 0 Then _
ThongBao = ThongBao & Chr(13) & Chr(13) & " -" & Format(i, "#,##0") & " Names da xoa"

MsgBox ThongBao, vbInformation, "GPE"

Application.StatusBar = ""
Application.DisplayStatusBar = OldStatus
End Sub
 
Mình xem qua rồi chắc tại bạn thêm quá nhiều đối tượng form trong Object đó thôi Google
 
Nếu bạn vẫn muốn delete một loạt thì nên làm ngược từ số lớn trở về số nhỏ - với hy vọng tránh được tình trạng index hoặc bộ nhớ bị sắp xếp lại thường xuyên

Mình nghĩ cũng không cần, Code của mình:
Mã:
Sub DelObjects()
  Dim i As Long, wks As Worksheet
  On Error Resume Next
  Set wks = ActiveSheet
  For i = 1 To 10000
    wks.Shapes([COLOR=#ff0000][/COLOR][SIZE=4][COLOR=#ff0000][B]1[/B][/COLOR][/SIZE]).Delete
  Next
  MsgBox "Còn " & wks.Shapes.Count & " objects"
End Sub
Cái màu đỏ là số 1 chứ hổng phải chữ i nha. Bạn nghĩ nó hợp lý chứ
 
Mình nghĩ cũng không cần, Code của mình:
Mã:
Sub DelObjects()
  Dim i As Long, wks As Worksheet
  On Error Resume Next
  Set wks = ActiveSheet
  For i = 1 To 10000
    wks.Shapes([SIZE=4][COLOR=#ff0000][B]1[/B][/COLOR][/SIZE]).Delete
  Next
  MsgBox "Còn " & wks.Shapes.Count & " objects"
End Sub
Cái màu đỏ là số 1 chứ hổng phải chữ i nha. Bạn nghĩ nó hợp lý chứ

Không phải tôi nói nó đúng hay không đúng.
Theo tôi suy diễn (không chắc là đúng, bởi vậy trước đó tôi có dùng từ "hy vọng") thì:
- Mỗi lần nó xoá đi phần tử số 1 thì các phần tử 2, 3, ... được đôn lên.
- Mỗi lần đôn như thế có thể tốn năng lượng.
Sự tốn năng lượng kể trên chỉ là ước phỏng. Nếu bên trong máy, các phần tử được xếp theo dạng nối đuôi vòng (circular queue) thì xoá đầu hay xoá đuôi không khác nhau bao nhiêu bởi vì việc xoá được thực hiện bằng cách dời con trỏ (tương tự như offset)
 
Không phải tôi nói nó đúng hay không đúng.
Theo tôi suy diễn (không chắc là đúng, bởi vậy trước đó tôi có dùng từ "hy vọng") thì:
- Mỗi lần nó xoá đi phần tử số 1 thì các phần tử 2, 3, ... được đôn lên.
- Mỗi lần đôn như thế có thể tốn năng lượng.
Sự tốn năng lượng kể trên chỉ là ước phỏng. Nếu bên trong máy, các phần tử được xếp theo dạng nối đuôi vòng (circular queue) thì xoá đầu hay xoá đuôi không khác nhau bao nhiêu bởi vì việc xoá được thực hiện bằng cách dời con trỏ (tương tự như offset)

Chính vì thế mà xóa đuôi luôn là bài bản. Vì xóa đuôi không bao giờ có chuyện dồn lên, còn xóa đầu có thể có dồn lên.
Trong Delphi có component TStringList mà phương thức Delete của nó là (Delphi source code)

Mã:
procedure TStringList.Delete(Index: Integer);
begin
  if (Index < 0) or (Index >= FCount) then Error(@SListIndexError, Index);
  Changing;
  Finalize(FList^[Index]);
  Dec(FCount);
  if [B][COLOR=#0000ff]Index < FCount[/COLOR][/B] then
    [B][COLOR=#ff0000]System.Move(FList^[Index + 1], FList^[Index],
      (FCount - Index) * SizeOf(TStringItem));[/COLOR][/B]
  Changed;
end;

Chỗ đỏ đỏ chính là chỗ dồn lên, được thực hiện khi xóa phần tử không là cuối.
Vậy vd. ta có danh sách 10000 string mà ta xóa 5000 string cuối thì:

1. Xóa 5000 lần phần tử 5001 --> có 5000 lần thực hiện đỏ đỏ
2. Xóa 5000 lần phần tử cuối, tức xóa phần tử 10000, 9999, 9998, ..., 5001 --> đỏ đỏ không thực hiện lần nào.
 
Khi dùng lệnh xóa các phần tử thì nên xóa từ phần tử cuối như các bác nói trên là bài bản rồi. Còn việc chạy vòng lặp For Each luôn duyệt từ đầu đến cuối chứ không chạy ngược lại được. Vậy có thể dùng các loại vòng lặp còn lại và cho chạy lùi là được.
 
Trong VBA thì cái này phải thí nghiệm mới tin à nghen. Để xem sao cái
Ẹc... Ẹc...

Đồng ý 100%.
Chính vì vậy mà tôi vẫn nhét thêm trạng từ "hy vọng" (hopefully) và "có thể" (perhaps).
Bác Siwtom cũng dùng từ "bài bản". Theo tôi hiểu thì bác ấy muốn nói "nên làm, chứ không bắt buộc phải làm".
 
Bác Siwtom cũng dùng từ "bài bản". Theo tôi hiểu thì bác ấy muốn nói "nên làm, chứ không bắt buộc phải làm".

Thì ý là thế.

Trích
Cũng có thể bỏ từng em thứ 1 nhưng như thế thì sau mỗi lần bỏ thì toàn bộ "hàng hiện hành" phải dịch lên đầu 1 "chỗ".

Tôi tin chắc rằng nếu ai có máy mạnh thì có thể test 2 kiểu delete và theo tôi kiểu luôn delete cuối là nhanh hơn.

Chỗ đỏ đỏ có ý là cả 2 cách đều được, đều không sai.
 
Để kiểm trả tốc độ em có thử code này với file HHHHHHHHHHHH.xlsx
Code thứ nhất
Mã:
Sub test()
Dim k As Long, TG As Double, i As Long
TG = Timer
k = ActiveSheet.Shapes.Count
For i = 1 To k
    ActiveSheet.Shapes(1).Delete
Next
[L1] = Timer - TG
End Sub
Cho thời gian là 182 giây trên máy em
Code thứ 2
Mã:
Sub test()
Dim TG As Double, k As Long, wks As Worksheet
TG = Timer
Set wks = ActiveSheet
k = wks.Shapes.Count
Do While k > 0
    wks.Shapes(k).Delete
    k = k - 1
Loop
[K1].Value = Timer - TG
End Sub
Cho thời gian 470s trên máy em
Trong khi đó test thử từng shape thì thấy nó làm việc như sau:
Em Test thử 4 shapes theo thứ tự vẽ từng shape 1 và đánh số 1 đến 4 rồi dùng code ActiveSheet.Shapes(1).Delete thì shape 1 delete mất, chạy lần nữa Shape 2 delete mất chứng tỏ nó có sự sắp xếp lại

Tương tự Em Test thử vẽ 1 shapes rồi copy shape đó thành nhiều shapes đánh số 1 đến 4 rồi dùng code ActiveSheet.Shapes(1).Delete thì shape 1 delete mất, chạy lần nữa Shape 2 delete mất chứng tỏ nó có sự sắp xếp lại

Em Test ngược vẽ 4 shape dùng code Activesheet.Shapes(4) thì Shape 4 biến mất tiếp ActiveSheet.Shapes(3) thì Shapes(3) mất chứng tỏ nó không có sắp xếp lại

Mà khi test code lại kết quả sắp xếp lại nhanh hơn sắp xếp lại????? +-+-+-+
 
Đồng ý 100%.
Chính vì vậy mà tôi vẫn nhét thêm trạng từ "hy vọng" (hopefully) và "có thể" (perhaps).
Bác Siwtom cũng dùng từ "bài bản". Theo tôi hiểu thì bác ấy muốn nói "nên làm, chứ không bắt buộc phải làm".

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
 
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ử.
 
Lần chỉnh sửa cuối:
\

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ử.

Nói thật lòng: Đọc đến chỗ này là mình xem như... ngu luôn rồi ---> Hết biết gì ráo
Nhưng dù sao vẫn cảm ơn bạn, vì bây giờ không biết, biết đâu mai này sẽ biết
Ẹc... Ẹc...
 
Xin chân thành cảm ơn các anh chị đã giúp đỡ mình :)
 
Bác nào nghiên cứu thời gian chạy cho các thuật toán xóa Shape khác nhau để tìm code tối ưu luôn đi.
 

Bài viết mới nhất

Back
Top Bottom