Algoritmo di ordinamento per Excel / SharedStrings


10

In Excel, "comprimono" le stringhe in una mappatura numerica (anche se non sono sicuro che la parola compressa sia corretta in questo caso). Ecco un esempio mostrato di seguito:

inserisci qui la descrizione dell'immagine

Mentre questo aiuta a ridurre le dimensioni complessive del file e il footprint di memoria, in che modo Excel esegue l'ordinamento su un campo stringa? Ogni singola stringa dovrebbe passare attraverso il mapping di ricerca: e in tal caso, ciò non aumenterebbe notevolmente il costo di / rallentando facendo un ordinamento su un campo di stringa (e se ci fossero valori 1M, le ricerche chiave 1M non sarebbero banale). Due domande su questo:

  1. Le stringhe condivise vengono utilizzate all'interno dell'applicazione Excel stessa o solo durante il salvataggio dei dati?
  2. Quale sarebbe un algoritmo di esempio da ordinare sul campo allora? Qualsiasi linguaggio va bene (c, c #, c ++, python).

Sarò interessato a una risposta esperta anche a questo. Posso solo immaginare che abbia qualcosa a che fare con la memorizzazione nella memoria della memoria, ma può essere facilmente sbagliato.
PeterT

Penso che il fatto che questa mappatura esista nella rappresentazione XML fisica di un documento sia indipendente dal modo in cui Excel rappresenta internamente i dati in fase di esecuzione. Ritengo che sia più efficiente dal punto di vista computazionale rappresentare colonne di dati in modo grezzo (sebbene ciò possa essere fatto in molti modi).
alxrcs,

@alxrcs ci sono documenti o libri che vanno all'interno di Excel, in modo simile a SQL Server? amazon.com/Pro-Server-Internals-Dmitri-Korotkevitch/dp/… , o è fondamentalmente una scatola nera al di fuori del team ms?
David542,

Non sono sicuro, scusa. Puoi trovare online alcune specifiche per i formati di file, ma non credo che i dettagli sugli interni di runtime di Excel siano così facili da trovare.
alxrcs,

Comunque, dalla tua seconda domanda sospetto che tu sia più interessato alla teoria che alle specifiche di Excel, giusto?
alxrcs,

Risposte:


0

Non riesco a trovare esattamente il modo in cui Excel memorizza le celle con SharedStringTableelementi in memoria in fase di esecuzione, ma la loro memorizzazione come indice dell'elemento SharedStringTablerichiede solo una ulteriore discrezione per accedervi, supponendo che gli elementi siano memorizzati come un array. Quindi la mia ipotesi è che sia così. Questo è il modo più semplice e l'unico modo per renderlo più veloce è avere una rappresentazione runtime SharedStringTablegià ordinata per elementi. In tal caso, l'ordinamento per indice è equivalente all'ordinamento per valore. Tale approccio, tuttavia, rende costosa l'operazione di inserimento come quando una nuova stringa viene inserita al centro della tabella, tutti gli indici più grandi di quanto dovrebbero essere incrementati e il numero di tali celle nel documento può essere molto grande, fino a tutte le celle riferite a SharedStringTable.

Se le celle contengono indici uguali a quelli del file, ecco come si ordinerebbero le celle rappresentate dal columnValuevettore in base alle stringhe che stanno indicando memorizzate nel sharedStringsvettore (in C ++ poiché hai detto che non c'è differenza) al costo di 2 extra dereferenze per operazione di confronto:

// sort indexes from columnValue based on comparing values in sharedStrings
sort(columnValue.begin(), columnValue.end(), 
     [&sharedStrings](size_t i1, size_t i2){return sharedStrings[i1] < sharedStrings[i2];});

Non era nell'OP, ma l' SharedStringTableoperazione di ricerca inversa è lenta e la memorizzazione nella cache di elementi in un dizionario aiuta.


0

Tabella stringhe condivise di Microsoft Excel

La tabella delle stringhe condivise è e lo standard Open XML, come definito dalla norma ISO - ISO / IEC 29500-1: 2016 (E)

Definizione ufficiale di stringhe condivise (citata dal documento ISO)

Tabella delle stringhe condivisa

I valori di stringa possono essere memorizzati direttamente all'interno degli elementi delle celle del foglio di calcolo; tuttavia, la memorizzazione dello stesso valore all'interno di più elementi di cella può comportare Parti di fogli di lavoro molto grandi, con conseguente possibile riduzione delle prestazioni. La tabella di stringhe condivisa è un elenco indicizzato di valori di stringa, condiviso nella cartella di lavoro, che consente alle implementazioni di memorizzare i valori una sola volta.

Lo standard ISO sulle stringhe condivise può essere scaricato da

https://standards.iso.org/ittf/PubliclyAvailableStandards/c071691_ISO_IEC_29500-1_2016.zip

Risposte alle domande su questo argomento

Domanda 1: le stringhe condivise vengono utilizzate all'interno dell'applicazione Excel stessa o solo durante il salvataggio dei dati?

Risposta: Le stringhe condivise vengono utilizzate da Excel solo al momento del salvataggio del documento, IE, solo allo scopo di archiviare il foglio di calcolo come file nella memoria.

Tuttavia, quando il file viene aperto per la visualizzazione, le celle vengono popolate con i valori di stringa effettivi estratti dalla tabella delle stringhe condivise.

-

Domanda 2: quale sarebbe allora un algoritmo di esempio da ordinare sul campo? Qualsiasi linguaggio va bene (c, c #, c ++, python).

Risposta: Per un'applicazione come Excel, suppongo che una speciale variante proprietaria dell'ordinamento rapido sia l'algoritmo più probabile da utilizzare per l'ordinamento sui valori di stringa.

Excel ha un limite di 1.048.576 righe. Per queste dimensioni, l'ordinamento rapido è sicuramente un vincitore. L'ordinamento rapido può produrre risultati molto efficienti per set di dati di questa portata.

Ecco il link all'implementazione di Quick Sort in C ++ per l'ordinamento delle stringhe:

http://www.cplusplus.com/forum/beginner/101599/


2
l'ordinamento rapido sarebbe sulla stringa stessa, avresti bisogno di dereferenziare un puntatore o fare una mappa di ricerca un milione di volte, no? Penso che questa risposta stia semplicemente dicendo "Sì, fa String condivise. Ecco come fare un ordinamento senza stringhe condivise".
David542,

2
La tabella delle stringhe condivise viene utilizzata solo per l'archiviazione del contenuto del file su disco. Lo standard ISO non specifica il modo in cui le celle devono essere popolate quando l'applicazione è aperta. Se le celle vengono popolate con una copia del valore di stringa estratto dalla tabella di stringhe condivisa, è possibile evitare la dereferenziazione.
Gopinath,

1
Vedo. Sì, il mio principale punto di interesse qui è stato il modo in cui viene gestito in memoria, al di fuori dell'aspetto da / a-storage. Hai qualche idea su quella parte di esso?
David542,

Nell'ordinamento Excel, l'utente deve specificare l'ordinamento come un elenco di colonne (Esempio: ordina per colonna A, quindi per B, quindi per C, quindi per D). Supponiamo che la colonna A contenga stringhe duplicate. Durante l'ordinamento, tutte le righe con lo stesso valore per la colonna A verranno ordinate in base ai valori di "Colonna B". Se anche le celle di B contengono valori duplicati, l'ordinamento verrà eseguito sulla colonna C ... quindi fino a quando non viene trovata la colonna con valori univoci. Se nessuna delle colonne ha valori univoci, le righe verranno ignorate.
Gopinath,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.