La tua domanda è pericolosa. Supponendo che la generalità sia l'opposto della semplicità.
Poiché questa domanda, in parte, riguarda la semantica, definiamo i termini.
Generale - applicabile a una varietà di situazioni, robusto, utile
Semplice: facile da capire, ovvio, con poche parti
Questi sono in realtà due assi. L'opposto del generale è specifico . L'opposto di semplice è complicato (non complesso).
Le migliori soluzioni di programmazione sono sia semplici che ampli; Generale.
Usare un linguaggio bene è l'arte stessa di rendere semplice la soluzione generale.
Dato che stai chiedendo qualcosa di soggettivo, ecco la mia opinione. La tua soluzione al problema è generale, ma non è semplice. Anche altre soluzioni, come quelle che richiedono intuizione su 0 o 1 nella matrice, non sono semplici. In effetti, qualsiasi soluzione descritta in termini di algoritmo per trovare la soluzione non è semplice.
Questo è un errore che molti programmatori (la maggior parte?) fanno. Decompongono il problema nelle loro teste, ma non condividono tale decomposizione con il codice. In questa domanda, la prima cosa che si dovrebbe fare per rendere evidente a un nuovo lettore del codice è "Cosa stiamo facendo"? Stiamo trasformando le righe in numeri? Stiamo navigando in una griglia di bit? Stiamo ragionando sulle proprietà della matrice? Rendilo esplicito. Ciò impedisce a un nuovo lettore di dover decodificare le idee ogni volta che esamina il codice.
La tua soluzione è confrontare le righe .
È possibile aggiungere al codice la nozione secondo cui si confrontano le righe prima che sia necessario preoccuparsi se si tratta di NxN o NxM. Questi dettagli vengono gestiti nel modo in cui si confrontano le righe, ma a quel punto il problema è cambiato da una matrice a due righe (un problema più semplice). Successivamente, anche il confronto di due righe semplifica il confronto di due bit in quelle righe.
Interfacce fluenti, codice dichiarativo, ecc., tutti cercano di affrontare questi problemi. I compilatori stanno migliorando sempre di più nell'integrare l'efficienza (anche i processori). I giorni di dover scrivere un algoritmo di loop di basso livello intelligente per l'efficienza stanno andando via.
Considera un codice come questo:
Row smallest = matrix.FirstRow
for each Row r in matrix.rows
if r < smallest
smallest = r
L'orientamento degli oggetti consente di memorizzare tutti i tipi di stato in un oggetto Row. ciò consente di incorporare gli stratagemmi nella soluzione nell'oggetto Row (incluso il trucco 'which row am I on'; l'operatore < può essere sovraccaricato per fare cose come la colonna 0 o 1 confronta su quella riga). L'efficienza può essere fatta allo stesso modo, pur rendendo semplice (ovvio) cosa sta succedendo.
Ancora prima di parlare di implementare la 'ricerca' per la riga migliore, ci sono un sacco di informazioni nel setup della matrice stessa (righe ordinate, ecc.) In effetti, se fosse C #, scriverei semplicemente la ricerca come matrix.Rows.Min () e crea una rappresentazione di Matrix e Rows che prende queste assunzioni nella sua definizione. Ciò rende questi invarianti configurati dalla domanda implicita nel codice invece che solo "conosciuti" dalle supposizioni difficili che l'algoritmo di loop può fare.
Una volta che lo fai, vedrai accadere ogni genere di cose belle. I trucchi dicevano di cercare solo il 0000, o 0001 sarà ovvio perché sarete in grado di ottimizzare la struttura della matrice stessa (pensate alla matrice di NumberOf0 [RowNumber]). L'ultimo bit è "diventare complicato" ma almeno è la complessità in che rappresenta i dati di input e non ancora cercare la soluzione .
La decomposizione fornisce sia la generalità che la potenza, mantenendo le cose semplici.
Link:
link
link