Qual è la struttura di dati più complicata che hai usato in una situazione pratica? [chiuso]


17

Il germe di questa domanda è emerso da una discussione che stavo avendo con un paio di colleghi sviluppatori del settore.

Si scopre che in molti casi i project manager sono diffidenti nei confronti di strutture dati complesse e generalmente insistono su tutto ciò che esiste immediatamente dalla libreria / pacchetti standard. L'idea generale sembra essere come usare una combinazione di ciò che è già disponibile a meno che le prestazioni non siano seriamente ostacolate. Questo aiuta a mantenere semplice la base di codice, che per i non diplomatici significherebbe "abbiamo un forte attrito e quelli nuovi che assumiamo potrebbero non essere così buoni".

Quindi nessun filtro di fioritura o skip-list o alberi di splay per i tuoi drogati di CS. Quindi, ecco la domanda (di nuovo): qual è la struttura dati più complicata che hai fatto o utilizzato in ufficio?

Aiuta a capire quanto sono buoni / sofisticati i software del mondo reale.


Scritto da altri o da noi stessi?

Il mio intento originale era quello che si è sviluppato da solo, ma penso che aggiunga una dimensione interessante alla domanda. Domanda originale modificata.
Fanatic23,

Renderlo complesso non significa che sia sofisticato. Più semplice = meglio sempre.
TP1

I più complessi erano sempre disponibili da STL. La complessità di solito deriva da strutture di dati nidificate, non dal loro tipo. Struttura semplice = buona, a meno che il profiler non si lamenta.
Coder,

-1 per la valutazione del valore non necessaria. Potrei dire altrettanto: in questi giorni, se implementi tu stesso le infrastrutture dei dati, sei stupido e testardo. Non essere il prossimo bambino intelligente che pensa di poter implementare una struttura di dati nel modo sbagliato.
Pieter B,

Risposte:


7

Ho usato gli elenchi di salto per la ricerca. Dove lavoro, c'è un'implementazione standard e tutti sono incoraggiati a usarla. Hanno usato i tentativi di patricia per archiviare e recuperare gli indirizzi IP in modo efficiente. Ancora una volta l'implementazione era già presente.


7

Sono uno sviluppatore Java. Java Collection Framework è in grado di risolvere i miei problemi di struttura dei dati del 90%, mentre altri 10% hanno bisogno di sforzi. Penso che se capisci davvero la sofisticata lib standard scritta dagli esperti, troverai che aiutano nella maggior parte dei casi.

Strutture di dati complessi sono difficili da mantenere nel mondo reale. Per evitare di incasinare il codice, dividerò un problema per alcuni più piccoli. Ogni piccolo problema può essere risolto da Java Collection Framework . Forse la soluzione non è la più intelligente (ha bisogno di più memoria e più lenta), ma funziona e è facile da mantenere. È un compromesso.

Se devo scrivere una struttura dati complessa, prenderò il libro di testo :)


4

La struttura di dati più complicata che ho usato sul lavoro è stata un trie. Tuttavia, è stato venti anni fa.

Il problema con lo sviluppo di software industriale è che la maggior parte dei programmatori industriali non sono laureati in informatica; pertanto, le tecniche che il gradiente CompSci medio dà per scontate sono considerate troppo difficili da mantenere per i programmatori pane e burro.

La mancanza di conoscenze generali su CompSci nel settore è un problema serio. Ad esempio, ho perso il conto del numero di sviluppatori di software che ho incontrato che non comprendono che espressioni come! (A! = 5 && b! = 3) e a == 5 || b == 3 sono logicamente equivalenti. Chiunque sappia applicare il teorema di DeMorgan può riconoscere che queste espressioni sono logicamente equivalenti. La maggior parte dei laureati non CompSci non ha mai sentito parlare del teorema di DeMorgan. Se si esamina qualsiasi base di codice sostanziale, si troveranno molte occorrenze di espressioni che negano le sottoespressioni logiche negative. La leggibilità del codice che contiene sottoespressioni logiche negative negate viene quasi sempre migliorata trasformando queste espressioni nella loro forma non negata.


5
Il mio consiglio a tutti coloro che esprimono un voto "negativo" è che si dovrebbe aggiungere un commento in cui si afferma il motivo per cui si vuole esprimere il proprio voto "negativo". Posso gestire qualcuno che ha un'opinione diversa. Tuttavia, ciò che non posso gestire è la codardia.
bit-twiddler,

2
@ bit-twiddler Ho imparato il teorema di De Morgan nella mia laurea in filosofia. Ora sto facendo CS, non è stato menzionato. Onestamente, vedo questo genere di cose come una scorciatoia che viene meglio con l'esperienza. Hai davvero bisogno di ricordare le regole (e per nome!) Che utilizzi per la fattorizzazione di un'equazione? Non ti conosco, ma lo risolvo basandomi su ciò che è di fronte a me e non a memoria. Lo stesso vale per la modifica delle espressioni logiche.
Rupert Madden-Abbott,

2
@Rupert: il teorema di De Morgan è generalmente coperto da una discreta organizzazione matematica e informatica (entrambi i quali sono richiesti corsi di laurea negli Stati Uniti). Mi sono concentrato in architettura informatica / software di sistema come studente universitario. Il teorema di De Morgan è ampiamente utilizzato nella progettazione della logica digitale. Ci sono aree nello sviluppo di software di basso livello in cui conoscere il teorema di De Morgan diventa fondamentale. Ad esempio, ci sono computer con set di istruzioni minimi che non contengono un set completo di istruzioni booleane; pertanto, si deve poter derivare un'operazione booleana da un'altra.
bit-twiddler,

1
(segue) Ecco un test che la maggior parte dei laureati non informatici / ingegneria informatica / ingegneria elettrica (concentrazione di ingegneria informatica) o falliscono apertamente o impiegano molto tempo a rispondere. Dato solo l'operazione NAND (negativa), derivano le seguenti operazioni booleane: NOT, AND, OR, NOR, XOR e XNOR. Conoscere il teorema di De Morgan rende molto più facile derivare quelle sei operazioni booleane. Il teorema di De Morgan è facilmente il teorema più importante nella progettazione della logica digitale.
bit-twiddler,

1
..... anche se per essere onesti, in un settore in cui MOLTA parte del lavoro è dedicata alla scrittura di app RoR a metà per alcune piccole aziende, probabilmente c'è circa 1 volta su 1000000000 in cui avresti persino bisogno di avere HEARD del concetto di porte logiche e algebra booleana, invece di conoscere semplicemente il significato delle parole inglesi "o" e "e" e ". non dire che queste cose non sono rilevanti per sapere se stai facendo un lavoro CS o algoritmi complessi o ottimizzazioni o programmazioni di basso livello, ma per la maggior parte delle persone che lavorano come programmatori, è una specie di curiosità inutile.
Sara

2

Una volta ho scritto una coda del calendario (O (1) coda di priorità) per una simulazione basata su eventi in cui la profilazione ha mostrato che l'heap esistente era un collo di bottiglia.

Ho anche rilasciato un prodotto che conteneva una macchina a stati finiti con circa 80000 stati: il codice per generarlo era un po 'complicato, per non dire altro.


2

Molto, molto, molto tempo fa, in una galassia ... Ha lavorato in una squadra che utilizzava i "buffer amici" di Knuth in un RTOS in assemblatore.

Inoltre, Conway's Game of Life con 256 generazioni per un mondo di 1024 x 1024.


1

Non usato nulla di troppo speciale, da zero sarebbe un elenco doppiamente collegato .

Non molto eccitante, ho usato altre strutture. Ma la tua domanda è stata scritta da zero.


in C ++, std::liste non c'è davvero nulla di complicato: / Trovo l'albero rosso-nero / l'albero AVL molto più complicato, con tutte quelle condizioni di riequilibrio!
Matthieu M.,

@Mathieu std :: map e molto probabilmente otterrai un albero rb.
aufather, il

1

Un albero di hashtable contenente elenchi generici di dati finanziari - non chiedere nemmeno. A volte vorrei essere un cowboy. Ah, la vita semplice sotto le stelle ...


rimuove gli occhiali "Caro Dio".
Len Joseph,

1

Ho dovuto scrivere da zero una struttura circolare a doppio elenco per l' algoritmo Dancing Links per un risolutore di Sudoku. Sembrava di progettare un cubo di Rubik. L'intera struttura era fondamentalmente un elenco di elenchi, con ciascun nodo che ne indicava altri quattro.


1
Sembra eccessivo per un risolutore di Sudoku, poiché un algoritmo di backtracking a forza bruta risolve il puzzle più velocemente di quanto tu possa inserire i dati.
Kevin Cline,

3
@kevin, dancing links è un algoritmo di backtracking a forza bruta, ma con un plausibile euristico.
Peter Taylor,

Hai bisogno di un euristico se stai per fare cose come elencare il numero totale di soluzioni e affermare che un Sudoku ha solo 1 soluzione unica.
ProdigySim


0

Dopo averci pensato, la struttura di dati più "complicata" che ho fatto da zero è la modellazione di una rete di elementi basata su elenchi doppiamente collegati. Ma è stato anni fa quando ero abituato a programmare a livello di sistema.

In questi giorni difficilmente creo strutture di dati fantasiose. La maggior parte accade nel database in cui decidi cosa inserire in una tabella, forse un valore precalcolato, forse l'ID di un record correlato per un rapido recupero per evitare inutili ricerche.

Personalmente penso che il compito a portata di mano definisca i mezzi. Perché sforzarsi di fare uso di una struttura di dati esotici se non è utile? E se posso dire nella maggior parte della programmazione pratica applicata, probabilmente non è necessario reinventare la ruota.


Il mio intento non era quello di forzare una struttura di dati esotici. Ma è una situazione triste quando hai bisogno di qualcosa fuori dagli schemi e devi affrontare tutto ciò che è già disponibile solo perché la politica aziendale lo impone.
Fanatic23,

0

Conta una coda prioritaria? Questo si presenta in quasi tutte le applicazioni in tempo reale che ho scritto. È entrato a far parte della libreria Java standard solo di recente (Java 1.5).

A parte questo, non riesco a pensare a nulla di complicato che volevo davvero non essere stato in grado di estrarre da una biblioteca. Non lascerei che ciò mi fermasse, ma mi chiedevo perché avevo bisogno di una struttura di dati troppo esotica da includere nelle biblioteche. Cercherei sicuramente un'implementazione open source esistente di un filtro trie o bloom o di un elenco skip prima di provare a scriverne uno da solo.

In generale, concordo con il proprio manager sul fatto che il costo di costruzione e gestione di una struttura di dati personalizzata troppo esoterica per non esistere una versione della libreria è probabile che superi qualsiasi vantaggio in termini di prestazioni che ne deriva. Vorrei che mostrassi, tramite la profilazione, che le semplici strutture della biblioteca stanno causando una significativa penalizzazione delle prestazioni prima di lasciarti andare avanti e ottimizzarle con qualcosa di elegante. Perché come regola generale, è più economico acquistare cicli di processore rispetto ai cicli di ingegneria.

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.