Estructura de datos RTL de la biblioteca en tiempo de ejecución de Delphi

 

 

 

Estructura de datos RTL de la biblioteca en tiempo de ejecución de Delphi

Compañeros, un tramo al día, el agua fluye ...

secuencia

        La mayoría de ellos se almacenan en las unidades System.Classes y System.Generics.Collection , que pueden simplificar enormemente el trabajo diario.

        Es una clase diseñada específicamente para almacenar y recuperar datos.

        Cada estructura de datos en el mundo busca un equilibrio entre cuatro tipos diferentes de procesamiento de datos: modificar datos, insertar datos, buscar datos y eliminar datos. Algunas estructuras de datos son buenas en algunos campos y otras son buenas en otros campos. Sin embargo, no existe una estructura de datos en este mundo que pueda hacer que las cuatro operaciones anteriores sean independientes del tamaño de los datos (registros, etc.), y no pueden ser Bajo este tipo de tendencia de crecimiento de datos, los 4 tipos de procesamiento de datos anteriores están garantizados para lograr el mismo rendimiento excelente.

        Al diseñar un programa, debemos saber cuáles son nuestras necesidades. Esto nos ayudará a elegir la estructura de datos adecuada para el diseño del programa.

       Delphi se puede utilizar para manejar el rendimiento de la estructura de datos de la cadena.

       案例: github \ Delphi-High-Performance \ Chapter 1 \ RandomWordSearch.dproj

estructura de datos Operaciones sobre datos Complejidad de tiempo medio de Big O Peor de los casos Observaciones
TStringList Acceso directo O (1)   TStringList proporciona dos modos de trabajo: sin clasificar y ordenado, el primero es el predeterminado.
  Añadir O (1) / O (log n)   En modo no clasificado , puede tener un buen rendimiento; de lo contrario, será muy malo
  Insertar O (1)    
  Eliminar O (1)    
  Índice de O (n) / O (log n)   Dicotomía: Encuentra la posición del índice; en el modo ordenado, es la dicotomía más adecuada.
  Ordenar O (n log n)   En el modo de clasificación , puede tener un rendimiento muy bueno; de lo contrario, será muy malo: porque primero establece IndexOf para encontrar la posición.
TDiccionario Acceso directo Sin acceso directo, solo se pueden usar métodos indirectos para atravesar elementos  

1. TDictionary no puede acceder al elemento TDictionary [i] de esta forma, solo puede atravesar los elementos de forma similar a for in do;

2. Otra limitación de TDictionary: no conserva el orden en que se agregan los elementos

  Añadir O (1) En) O (n) solo ocurre en conjuntos de datos especialmente personalizados, lo que no es fácil de encontrar en aplicaciones prácticas.
  Eliminar O (1) En) O (n) solo ocurre en conjuntos de datos especialmente personalizados, lo que no es fácil de encontrar en aplicaciones prácticas.
  TryGetValue O (1) En)

1. Excelente desempeño. O (n) solo ocurre en conjuntos de datos especialmente personalizados, lo que no es fácil de encontrar en aplicaciones prácticas.

2. TDictionary siempre almacena la clave y el valor de [par]. Porque si no con cualquier tecla en particular asociado con el valor de la información, sólo las palabras clave (Delphi no nos permite hacer caso omiso de la parte del valor), que podemos pedir el código por lo que el valor se define como un valor booleano , y siempre se establece en True.

  Contiene clave O (1) En) Excelente actuación. O (n) solo ocurre en conjuntos de datos especialmente personalizados, lo que no es fácil de encontrar en aplicaciones prácticas.
  Contiene Valor O (1)   Excelente actuación
resumen       El algoritmo O (n) (como la lista sin clasificar en este ejemplo ) se ejecuta mucho más lento que el algoritmo O (log n) (como la lista ordenada en este ejemplo ), mientras que el algoritmo O (1) (como el diccionario TDictionary en este ejemplo ) Es el más rápido de los algoritmos anteriores.
procedure TfrmRandomWordSearch.LoadWords(wordList: TStringList);
var
  word: string;
begin
  //:将英语单词数据库中的所有单词加载到内部数据结构中。
  //资料来源:https://github.com/dwyl/english-words。
  //数据库版权所有:infochimps
  FWordsUnsorted := TStringList.Create;
  FWordsUnsorted.Assign(wordList);
    //:未排序列表:您将看到,生成一个新单词通常需要几百毫秒到几秒钟。
      //:由于进程是随机的,并且依赖于 CPU 速度

  FWordsSorted := TStringList.Create;
  FWordsSorted.Assign(wordList);
  FWordsSorted.Sorted := True;
    //:排序列表:单词将计算得比“未排序列表”快得多。

  FWordsDictionary
    := TDictionary<string,boolean>.Create(wordList.Count);
  for word in wordList do
    FWordsDictionary.Add(word, True);
    //:而TDictionary方法在100毫秒内就能找到一个新词,
      //:它比“排序列表”和“未排序列表”快得多。
end;

procedure TfrmRandomWordSearch.FindGoodWord(
  const wordTest: TWordCheckDelegate);
var
  word: string;
  isWordOK: boolean;
  time: TStopwatch;
begin
  time := TStopwatch.StartNew;
  repeat
    word := GenerateWord;
    isWordOK := wordTest(word);
  until isWordOK or (time.ElapsedMilliseconds > 10000);
    //:随机提取不同长度的单词(10秒即为超时)
  if isWordOK then
    lbWords.ItemIndex
      := lbWords.Items.Add(
        Format('%s (%d ms)',
          [word, time.ElapsedMilliseconds] )
        )
  else
    lbWords.ItemIndex := lbWords.Items.Add('timeout');
end;

        Aunque el algoritmo y su complejidad temporal son útiles, no ayudará en ninguna situación. A veces ha utilizado el mejor algoritmo, pero su programa sigue siendo demasiado lento. En este caso, debe encontrar las partes lentas del programa y utilizar cualquier técnica posible para acelerarlas. Para hacer esto, primero debes encontrarlos. Por ejemplo: lento, dónde está la lentitud, es más lento en Agregar o más lento en Ordenar, etc.

 

 

 

Supongo que te gusta

Origin blog.csdn.net/pulledup/article/details/112148706
Recomendado
Clasificación