Frage

Hallo, ich Frage mich, ob es irgendeine bekannte Möglichkeit, um loszuwerden, unnötige Klammern in mathematischen Formeln.Der Grund, warum ich bin, diese Frage ist, dass ich zu minimieren solche Formel Länge

if((-if(([V].[6432])=0;0;(([V].[6432])-([V].[6445]))*(((([V].[6443]))/1000*([V].[6448])
+(([V].[6443]))*([V].[6449])+([V].[6450]))*(1-([V].[6446])))))=0;([V].[6428])*
((((([V].[6443]))/1000*([V].[6445])*([V].[6448])+(([V].[6443]))*([V].[6445])*
([V].[6449])+([V].[6445])*([V].[6450])))*(1-([V].[6446])));

es ist im Grunde der Teil der sql-select-Anweisung.Kann es nicht übertreffen 255 Zeichen und ich kann den code ändern, der produziert diese Formel (im Grunde eine black box ;) ) Wie Sie sehen, wie viele Klammern sind nutzlos.Nicht zu erwähnen die Tatsache, dass:

((a) * (b)) + (c) = a * b + c

Ich will also halten Sie die Reihenfolge der Operationen Klammern, Multiplikation/Division, addition/Subtraktion.

Arbeite in VB, aber die Lösung, die in jeder Sprache wird in Ordnung sein.

Bearbeiten

Ich fand eine entgegengesetzte problem (Klammern hinzufügen, um einen Ausdruck) Frage.

Ich dachte wirklich, dass dieses erreicht werden könnte, ohne schwere analysieren.Aber es scheint, dass einige parser, wird durch den Ausdruck, und speichern Sie es in ein expression tree ist unvermeidbar.

War es hilfreich?

Lösung

Könnten Sie Streifen in den einfachsten Fällen:

([V].[6432]) and (([V].[6443]))

Wird

v.[6432]

Sie nicht benötigen, sollten Sie die [], um den Tabellennamen oder den alias.

Man könnte es verkürzen, wenn Sie können alias die Spalten:

select v.[6432] as a, v.[6443] as b, ....

Oder sogar alle Tabellen abgefragt werden, in einer einzigen Unterabfrage - dann würden Sie nicht brauchen, die Tabelle Präfix:

if((-if(a=0;0;(a-b)*((c/1000*d
+c*e+f)*(1-g))))=0;h*
(((c/1000*b*d+c*b*
e+b*f))*(1-g));

select [V].[6432] as a, [V].[6445] as b, [V].[6443] as c, [V].[6448] as d, 
    [V].[6449] as e, [V].[6450] as f,[V].[6446] as g, [V].[6428] as h ...

Das ist natürlich alles ein bisschen psedo-code, aber es sollte helfen, Sie vereinfachen die vollständige Anweisung

Andere Tipps

Wenn Sie Interesse an Entfernen sind die nicht-notwendige Klammer in Ihrem Ausdruck, die generische Lösung besteht Ihren Text in das Parsen und bauen die zugehörigen Ausdrucksbaum.

Dann von diesem Baum, können Sie den entsprechenden Text ohne nicht-notwendige Klammer finden, indem sie einige Regeln anwenden:

  • , wenn der Knoten ein „+“, sind keine Klammern erforderlich
  • , wenn der Knoten eines „*“, dann Klammer für links (rechts) Kind nur erforderlich, wenn das linke (rechts) Kind ist ein „+“
  • gelten die gleichen für "/"

Aber wenn Ihr Problem ist nur mit diesen 255 Zeichen zu behandeln, können Sie wahrscheinlich nur Zwischenvariablen verwenden Zwischenergebnisse speichern

T1 = (([V].[6432])-([V].[6445]))*(((([V].[6443]))/1000*([V].[6448])+(([V].[6443]))*([V].[6449])+([V].[6450]))*(1-([V].[6446])))))
T2 = etc...

Ich weiß, dass dieser Thread wirklich alt ist, aber wie es durchsuchbar ist von Google.

Ich schreibe ein TI-83 Plus Taschenrechner-Programm, die ähnliche Fragen behandelt werden. In meinem Fall versuche ich die Gleichung für eine bestimmte Variable in Nummer tatsächlich zu lösen, aber es kann immer noch auf Ihr Problem beziehen, obwohl ich einen Array bin mit, so könnte es einfacher für mich sein, bestimmte Werte auszuwählen. ..
Es ist nicht ganz fertig, aber es ist von der großen Mehrheit der Klammern los mit (glaube ich), eine etwas elegantere Lösung.

Was ich tue, ist scannen durch die Gleichung / Funktion / was auch immer, die Verfolgung jeden Öffnung parenthese „(“ bis ich eine Schließung parenthese „)“, an welcher Stelle ich sicher sein kann, dass ich nicht in jedem laufen mehr tief verschachtelt parenthese.

y = ((3x + (2))) würde zeigen, die (2) zuerst, und dann das (3x + (2)), und dann die ((3x + 2))).

Was es tut, dann ist prüft die Werte unmittelbar vor und nach jedem parenthese. Im obigen Fall würde es zurückgeben + und). Jeder von ihnen ist ein Zahlenwert zugeordnet. Zwischen den zwei von ihnen wird die höher verwendet. Wenn keine Betreiber gefunden werden (*, /, +, ^, oder -). I auf einen Wert von 0 Default

Als nächstes scanne ich durch das Innere der Klammern. Ich verwende ein ähnliches Nummerierungssystem, obwohl in diesem Fall der niedrigste Wert I gefunden verwenden, nicht die höchste. I auf einen Wert von 5 default wenn nichts gefunden wird, wie im Fall wäre oben.

Die Idee ist, dass Sie eine Zahl auf die Bedeutung der Klammern durch Subtraktion der beiden Werte zuweisen können. Wenn Sie so etwas wie ein ^ auf der Außenseite der Klammern (2 + 3) ^ 5 diese Klammern sind potenziell sehr wichtig, und würden einen hohen Stellenwert gegeben werden, (in meinem Programm verwende ich 5 für ^).

Es ist möglich, jedoch, dass die Innen Betreiber die Klammern sehr unwichtig machen würde, (2) ^ 5 wo nichts gefunden. In diesem Fall würde der innere Wert von 5. Durch Subtraktion der beiden Werte zugewiesen werden, können Sie dann bestimmen, ob oder nicht eine Reihe von Klammern einfach durch Prüfen, ob die resultierende Zahl größer als 0. Im Fall (2 notwendig ist +3) ^ 5, a ^ würde einen Wert von 5 geben, und a + würde einen Wert von 1. Die sich ergebende Zahl geben 4 sein würde, was anzeigen würde, dass die Klammern sind in der Tat notwendig. Im Fall von (2) ^ 5 würde man einen inneren Wert von 5 und einen äußeren Wert von 5 aufweist, was in einem Endwert von 0, was zeigt, dass die Klammern unwichtig sind, und können entfernt werden.

Der Nachteil ist, dass (zumindest auf den TI-83) Scannen durch die Gleichung so oft unglaublich langsam ist. Aber wenn die Geschwindigkeit ist kein Problem ... Sie wissen nicht, ob das überhaupt helfen, könnte ich völlig vom Thema sein. Hoffe, dass Sie alles aufgestanden und zu arbeiten.

Ich bin mir ziemlich sicher, dass, um zu bestimmen, was Klammern nicht erforderlich sind, können Sie Haben die Ausdrücke in sie zu bewerten. Weil Sie nisten Klammern können, sind dies ist die Art von rekursiven Problem, dass ein regulärer Ausdruck nur in einer flachen Weise ansprechen kann, und wahrscheinlich zu falschen Ergebnissen. Wenn Sie bereits den Ausdruck Auswertung, vielleicht möchten Sie die Formel, wenn möglich vereinfachen. Dies bekommt auch etwas schwierig, und in einigen Ansätzen verwendet Techniken, die auch in maschinellem Lernen gesehen werden, wie Sie in dem folgende Papier sehen könnten: http://portal.acm.org/citation.cfm?id=1005298

Wenn Sie Ihre Variablennamen von 1 Abfrage an den nächsten nicht wesentlich ändern, könnten Sie eine Reihe versuchen von replace () Befehlen. d.

X=replace([QryString],"(([V].[6443]))","[V].[6443]")

Auch, warum kann es nicht mehr als 255 Zeichen übertreffen? Wenn Sie dies als ein String-Feld in einer Access-Tabelle speichern, dann könnten Sie versuchen, die Hälfte der Ausdruck in 1-Feld und die zweite Hälfte in einem anderen setzen.

Sie könnten auch Ihren Ausdruck versuchen Parsen mit ANTLR, yacc oder ähnliches und einen Parse-Baum erstellen. Diese Bäume optimieren in der Regel Klammern entfernt. Dann würden Sie nur Ausdruck von Baum zurück zu schaffen haben (ohne Klammern offensichtlich).

Es könnte nehmen Sie mehr als ein paar Stunden, obwohl diese Funktion zu erhalten. Aber Ausdruck Parsing ist in der Regel das erste Beispiel auf generische Analyse, so dass Sie vielleicht eine Probe nehmen können, und ändern Sie es nach Ihren Bedürfnissen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top