كيفية التخلص من الأقواس غير الضرورية في التعبير الرياضي

StackOverflow https://stackoverflow.com/questions/1063316

  •  21-08-2019
  •  | 
  •  

سؤال

مرحبًا، كنت أتساءل عما إذا كانت هناك أي طريقة معروفة للتخلص من الأقواس غير الضرورية في الصيغة الرياضية.سبب طرح هذا السؤال هو أنني يجب أن أقوم بتقليل طول هذه الصيغة

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])));

إنه في الأساس جزء من عبارة تحديد SQL.لا يمكن أن يتجاوز 255 حرفًا ولا يمكنني تعديل الكود الذي ينتج هذه الصيغة (في الأساس مربع أسود ؛)) كما ترى العديد من الأقواس غير مجدية.ناهيك عن حقيقة أن:

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

لذلك أريد الحفاظ على ترتيب العمليات: الأقواس، الضرب/القسمة، الجمع/الطرح.

أنا أعمل في VB، ولكن الحل بأي لغة سيكون جيدًا.

يحرر

لقد وجدت مشكلة معاكسة (أضف الأقواس إلى التعبير) سؤال.

اعتقدت حقًا أنه يمكن تحقيق ذلك دون تحليل ثقيل.ولكن يبدو أن بعض المحللين الذين سيتصفحون التعبير ويحفظونه في شجرة التعبير أمر لا مفر منه.

هل كانت مفيدة؟

المحلول

يمكنك تجريد أبسط الحالات:

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

يصبح

v.[6432]

لا ينبغي أن تحتاج إلى [] حول اسم الجدول أو الاسم المستعار الخاص به.

يمكنك تقصيرها أكثر إذا كان بإمكانك تسمية الأعمدة باسم مستعار:

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

أو حتى وضع جميع الجداول التي يتم الاستعلام عنها في استعلام فرعي واحد - فلن تحتاج إلى بادئة الجدول:

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 ...

من الواضح أن هذا كله عبارة عن كود زائف إلى حد ما، ولكنه من المفترض أن يساعدك على تبسيط البيان الكامل

نصائح أخرى

إذا كنت مهتمًا بإزالة الأقواس غير الضرورية في تعبيرك، فإن الحل العام يتمثل في تحليل النص وإنشاء شجرة التعبير المرتبطة.

ومن ثم، ومن هذه الشجرة، يمكنك العثور على النص المقابل دون قوسين غير ضروريين، وذلك بتطبيق بعض القواعد:

  • إذا كانت العقدة "+"، فلا حاجة لأي قوس
  • إذا كانت العقدة هي "*"، فإن الأقواس مطلوبة للطفل الأيسر (الأيمن) فقط إذا كان الطفل الأيسر (الأيمن) هو "+"
  • وينطبق الشيء نفسه على "/"

ولكن إذا كانت مشكلتك تتعلق فقط بالتعامل مع هذه الأحرف البالغ عددها 255 حرفًا، فمن المحتمل أن تتمكن من استخدام المتغيرات المتوسطة لتخزين النتائج المتوسطة

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

أعرف أن هذا الموضوع قديم جدًا، لكن يمكن البحث عنه في جوجل.

أقوم بكتابة برنامج الآلة الحاسبة TI-83 plus الذي يعالج مشكلات مماثلة.في حالتي، أحاول فعليًا حل المعادلة لمتغير معين في العدد، ولكن قد يظل الأمر مرتبطًا بمشكلتك، على الرغم من أنني أستخدم مصفوفة، لذلك قد يكون من الأسهل بالنسبة لي انتقاء قيم محددة. ..
لم يتم الانتهاء من الأمر تمامًا، لكنه تخلص من الغالبية العظمى من الأقواس باستخدام (على ما أعتقد)، وهو حل أنيق إلى حد ما.

ما أفعله هو البحث في المعادلة/الدالة/أيًا كان، وتتبع كل قوس فتح "(" حتى أجد قوس إغلاق ")"، وعند هذه النقطة يمكنني التأكد من أنني لن أواجه أي تداخل أكثر عمقًا قوسين.

y=((3x + (2))) سيُظهر (2) أولاً، ثم (3x + (2))، ثم ((3x + 2))).

ما يفعله بعد ذلك هو التحقق من القيم مباشرة قبل وبعد كل قوس.في الحالة أعلاه، سيتم إرجاع + و).يتم تعيين قيمة رقمية لكل منها.وبينهما يتم استخدام الأعلى.إذا لم يتم العثور على عوامل تشغيل (*،/،+،^، أو -) سأضع القيمة الافتراضية على 0.

بعد ذلك، أقوم بمسح ما بداخل الأقواس.أستخدم نظام ترقيم مشابهًا، على الرغم من أنني في هذه الحالة أستخدم أقل قيمة تم العثور عليها، وليس أعلى قيمة.أقوم بالقيمة الافتراضية 5 إذا لم يتم العثور على أي شيء، كما هو الحال في الحالة أعلاه.

الفكرة هي أنه يمكنك تعيين رقم لأهمية الأقواس عن طريق طرح القيمتين.إذا كان لديك شيء مثل ^على الجزء الخارجي من الأقواس (2+3) ^5 ، من المحتمل أن تكون هذه الأقواس مهمة للغاية ، وسيتم إعطاؤها قيمة عالية ، (في برنامجي أستخدم 5 لـ ^).

ومع ذلك ، فمن الممكن أن يجعل المشغلون الداخليون أقواس غير مهم للغاية ، (2)^5 حيث لم يتم العثور على شيء.في هذه الحالة، سيتم تعيين قيمة للداخل بقيمة 5.من خلال طرح القيمتين، يمكنك بعد ذلك تحديد ما إذا كانت مجموعة الأقواس ضرورية أم لا، وذلك ببساطة عن طريق التحقق مما إذا كان الرقم الناتج أكبر من 0.في حالة (2+3)^5، فإن ^ سيعطي قيمة 5، و+ سيعطي قيمة 1.سيكون الرقم الناتج هو 4، مما يشير إلى أن الأقواس مطلوبة بالفعل.في حالة (2)^5 ، سيكون لديك قيمة داخلية تبلغ 5 وقيمة خارجية 5 ، مما يؤدي إلى قيمة نهائية من 0 ، مما يدل على أن الأقواس غير مهمة ، ويمكن إزالتها.

الجانب السلبي لهذا هو أن المسح (على الأقل في TI-83) من خلال المعادلة مرات عديدة يكون بطيئًا بشكل يبعث على السخرية.لكن إذا لم تكن السرعة مشكلة...لا أعرف إذا كان ذلك سيساعد على الإطلاق، فقد أكون خارج الموضوع تمامًا.آمل أن تكون قد حصلت على كل شيء والعمل.

أنا متأكد من أنه من أجل تحديد الأقواس غير الضرورية، عليك يملك لتقييم التعبيرات داخلها.نظرًا لأنه يمكنك دمج الأقواس، فهذا هو نوع المشكلة العودية التي لا يمكن للتعبير العادي معالجتها إلا بطريقة ضحلة، وعلى الأرجح تؤدي إلى نتائج غير صحيحة.إذا كنت تقوم بتقييم التعبير بالفعل، فربما ترغب في تبسيط الصيغة إن أمكن.يصبح هذا أيضًا أمرًا صعبًا نوعًا ما، وفي بعض الأساليب يستخدم تقنيات يمكن رؤيتها أيضًا في التعلم الآلي، كما قد تراها في الورقة التالية: http://portal.acm.org/citizen.cfm?id=1005298

إذا لم تتغير أسماء المتغيرات الخاصة بك بشكل ملحوظ من استعلام واحد إلى الاستعلام التالي، فيمكنك تجربة سلسلة من أوامر استبدال ().أي.

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

ولماذا لا يتجاوز 255 حرفًا؟إذا كنت تقوم بتخزين هذا كحقل سلسلة في جدول Access، فيمكنك محاولة وضع نصف التعبير في حقل واحد والنصف الثاني في حقل آخر.

يمكنك أيضًا محاولة تحليل تعبيرك باستخدام ANTLR أو yacc أو ما شابه ذلك وإنشاء شجرة تحليل.عادةً ما تقوم هذه الأشجار بتحسين الأقواس بعيدًا.ثم سيتعين عليك فقط إنشاء تعبير مرة أخرى من الشجرة (بدون الأقواس بشكل واضح).

قد يستغرق الأمر أكثر من بضع ساعات لإنجاز هذا العمل.لكن تحليل التعبير عادة ما يكون المثال الأول على التحليل العام، لذلك قد تتمكن من أخذ عينة وتعديلها حسب احتياجاتك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top