2次元配列または正しく選択されたツールで繰り返しを検索する

良い一日。



ある程度、アルゴリズムに興味があります。 新鮮な記事に出くわした

「2次元配列の繰り返し、または例を使用して計算の複雑さを検索する」 http://habrahabr.ru/post/141258/ 。 この記事の著者であるSingerofthefallは、問題の解決とアルゴリズムの最適化について非常に興味深い話をしています。 とても興味深い。 しかし、私の意見では、まず第一に、アルゴリズムではなく、問題を解決するツールを決定する必要がありました。 そして、間違ったツールが選択されたため、全体の複雑さと最適化が行われました。

著者の問題を解決するには、DBツールが最も適していたため、使用する必要がありました。



2つの方法が可能です。

  1. データベースとしてxlsファイルにアクセスする方法については、 http://vbadud.blogspot.com/2008/05/using-excel-as-database.htmlをご覧ください。
  2. データをデータベースに転送し、後続の出力で処理します。


なぜなら 作業中に、よく似たタスクに遭遇します。2次元配列を処理しますが、xlsファイルではなく、AutoCADと座標を使用して、それがどのように機能するかを示します。



最も簡単なソリューション


  1. データベースを作成します。簡単にするために、DAOを使用します。 速度が重要な場合は、RamDiskにベースを作成するのが理にかなっています。
  2. データを受信するためのテーブルを作成する
  3. 初期データをテーブルに抽出します
  4. データをグループ化およびソートすることにより、最も単純なSQLクエリを実行します。
  5. データを表示します。




'  ,       IDE VBA      "Ioeaea! Auiieiaiea i?ia?aiiu i?a?aaii!" Sub grid() Dim retObj As AcadObject Dim retPnt As Variant Dim db As DAO.Database Dim rst As Recordset Dim ssetObj As AcadSelectionSet Dim Items As Object Dim handle As String mesto_db = Environ("APPDATA") & "\" name_db = Environ("UserName") & "_grid" Set fs1 = CreateObject("Scripting.FileSystemObject") fs1.CreateTextFile mesto_db & name_db & ".mdb" fs1.DeleteFile mesto_db & name_db & ".mdb" Set db = DAO.CreateDatabase(mesto_db & name_db & ".mdb", dbLangCyrillic) db.Execute "CREATE TABLE Tabl1 " & "(x REAL, y REAL, h CHAR(10));" On Error Resume Next Set ssetObj = ThisDrawing.SelectionSets("Boxa") If Err <> 0 Then Err.Clear Set ssetObj = ThisDrawing.SelectionSets.Add("Boxa") End If ssetObj.Clear ssetObj.SelectOnScreen On Error GoTo fuck Dim temp_block As AcadBlockReference For Each item In ssetObj If item.ObjectName = "AcDbBlockReference" Then If item.EffectiveName = "SV" Then Attributes = item.GetAttributes BlockProperties = item.GetDynamicBlockProperties point = item.insertionPoint point1 = CLng(point(0)) point2 = CLng(point(1)) Set temp_block = item handle = CStr(temp_block.handle) db.Execute "INSERT INTO Tabl1 (x,y,h) VALUES (" & point1 & ", " & point2 & ", \'" & handle & "\');" End If End If Next Set rst = db.OpenRecordset("SELECT x, y, h FROM Tabl1 GROUP BY x, y, h ORDER BY x, y, h ;") If rst.RecordCount > 0 Then rst.MoveFirst Do While Not rst.EOF = True X0 = rst.Fields(0) Y0 = rst.Fields(1) rst.MoveNext Loop End If fuck: If Err <> 0 Then ThisDrawing.Utility.Prompt (vbCrLf & "Error!" & vbCrLf) rst.Close db.Close Set db = Nothing ssetObj.Clear ssetObj.Delete End Sub
      
      







実行速度:


ポイント数-ランタイム

100 * 100-5.89秒

200 * 200-24.73秒

400 * 200-47.33秒

線形関係



結論:


私が最初に言及した記事の結論は非常に良いものであり、私はそれらのために2つの手を持っています。

常に最良の結果が最適なツールを提供するという3番目のポイントのみを追加します。



PS


1.(ソース)タグの注記には示されていませんが、VBAは機能します。

2.配列内の繰り返しを追跡するには、コレクションを使用できます

  Dim x_col As New Collection Dim txt_arr() As Variant For Q = 1 To UBound(txt_arr) x_col_Item = txt_arr(Q) x_col.Add x_col_Item, CStr(x_col_Item) Next
      
      





既にキーが含まれているコレクションにアイテムを追加すると、エラーが発生します。 それを処理するとき、繰り返し要素のみのセットを受け取ります。



All Articles