문제

안녕하세요 저는 수학 공식에서 불필요한 괄호를 제거 할 수있는 알려진 방법이 있는지 궁금합니다. 내가이 질문을하는 이유는 그러한 공식 길이를 최소화해야하기 때문입니다.

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 Select 문의 일부입니다. 255자를 능가 할 수 없으며 많은 괄호가 쓸모가 없기 때문에이 공식 (기본적으로 블랙 박스;)을 생성하는 코드를 수정할 수 없습니다. 사실을 언급하지 않음 :

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

따라서 운영 순서를 괄호로 유지하고, 곱/분열, 추가/빼기를 원합니다.

VB에서 일하지만 모든 언어로 된 솔루션은 괜찮습니다.

편집하다

나는 반대의 문제를 발견했다 (표현에 괄호를 추가) 의문.

나는 이것이 심한 구문 분석없이 달성 될 수 있다고 정말로 생각했다. 그러나 표현식을 거쳐 표현 트리에 저장하는 일부 파서는 불가능한 것으로 보입니다.

도움이 되었습니까?

해결책

가장 간단한 케이스를 제거 할 수 있습니다.

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

Becomes

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

분명히 이것은 모두 약간의 psedo 코드이지만 전체 진술을 단순화하는 데 도움이 될 것입니다.

다른 팁

표현에서 고세대 괄호를 제거하는 데 관심이있는 경우 일반 솔루션은 텍스트를 구문 분석하고 관련 표현 트리를 작성하는 것으로 구성됩니다.

그런 다음이 트리에서 몇 가지 규칙을 적용하여 해당 비 괄호없이 해당 텍스트를 찾을 수 있습니다.

  • 노드가 "+"인 경우 괄호가 필요하지 않습니다.
  • 노드가 "*"인 경우 왼쪽 (오른쪽) 자식이 "+"인 경우에만 왼쪽 (오른쪽) 자식에 괄호가 필요합니다.
  • "/"에 대해서도 동일한 신청

그러나 문제 가이 255자를 다루는 것이라면 중간 변수를 사용하여 중간 결과를 저장할 수 있습니다.

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

이 스레드는 정말 오래되었지만 Google에서 검색 할 수 있습니다.

비슷한 문제를 해결하는 TI-83 Plus 계산기 프로그램을 작성하고 있습니다. 제 경우에는 실제로 특정 변수에 대한 방정식을 숫자에 대한 방정식을 해결하려고하지만 배열을 사용하고 있지만 여전히 문제와 관련이있을 수 있으므로 특정 값을 선택하는 것이 더 쉬울 수 있습니다. ..
그것은 끝나지 않았지만 다소 우아한 솔루션 인 대부분의 괄호를 제거합니다.

내가하는 일은 방정식/함수/무엇이든 스캔하여 각 오프닝 농장을 추적하는 것 "("폐쇄 획기적인 획기적인 것을 찾을 때까지 ")을 추적하는 것입니다. 획기적인.

y = ((3x + (2)))는 (2)를 먼저, 그런 다음 (3x + (2)), ((3x + 2)))을 표시합니다.

그때는 각 빌레이어 직전과 직후에 값을 점검하는 것입니다. 위의 경우 +와)가 반환됩니다. 이들 각각에는 숫자 값이 할당됩니다. 두 사람 사이에서 더 높을수록 사용됩니다. 연산자가없는 경우 (*,/,+,^, 또는 -) i 기본값은 0입니다.

다음으로 괄호 안쪽을 스캔합니다. 비슷한 번호 시스템을 사용하지만이 경우 가장 높은 값이 가장 높지 않은 가장 낮은 값을 사용합니다. 위의 경우와 같이 아무것도 발견되지 않은 경우 5의 값으로 기본값을 기본적으로 기본적으로 기본적으로 기본적입니다.

아이디어는 두 값을 빼서 괄호의 중요성에 숫자를 할당 할 수 있다는 것입니다. 괄호 안에 a ^와 같은 것이 있다면 (2+3) ^5 괄호는 잠재적으로 매우 중요하며 높은 값이 주어질 것입니다 (내 프로그램에서는 5에 5를 사용합니다).

그러나 내부 연산자가 괄호를 매우 중요하지 않게 만들 수 있습니다. (2)^5 아무것도 발견되지 않았습니다. 이 경우 내부에 5의 값이 할당됩니다. 두 값을 빼면 결과 숫자가 0보다 큰지 확인하여 괄호 세트 세트가 단순히 0보다 큰지 여부를 결정할 수 있습니다. (2의 경우. +3) ^ 5, a ^는 5의 값을 제공하고 A +는 1의 값을 제공합니다. 결과 숫자는 4가 될 것이며, 이는 괄호가 실제로 필요하다는 것을 나타냅니다. (2)^5의 경우 내부 값이 5이고 외부 값이 5이며, 최종 값이 0이면 괄호가 중요하지 않으며 제거 될 수 있음을 보여줍니다.

이것의 단점은 (적어도 TI-83에서) 방정식을 통해 스캔하는 것은 엄청나게 느리다는 것입니다. 그러나 속도가 문제가되지 않는다면 ... 그것이 전혀 도움이 될지 모르겠습니다. 나는 완전히 주제가 될 수 있습니다. 당신이 모든 것을 얻고 일하기를 바랍니다.

나는 어떤 괄호가 불필요한 지 결정하기 위해 가지다 그들 안에있는 표현을 평가합니다. 괄호 안에서 둥지를 틀 수 있기 때문에 이것은 정규 표현이 얕은 방식으로 만 해결할 수 있고 가장 잘못된 결과를 얻을 수있는 일종의 재귀 문제입니다. 이미 표현식을 평가하고 있다면 가능하면 공식을 단순화하고 싶을 수도 있습니다. 이것은 또한 까다로워지고 일부 접근법에서는 다음 논문에서 볼 수있는 것처럼 기계 학습에서도 볼 수있는 기술을 사용합니다. http://portal.acm.org/citation.cfm?id=1005298

변수 이름이 1 쿼리에서 다음 쿼리로 크게 변경되지 않으면 일련의 대체 () 명령을 시도 할 수 있습니다. 즉

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

또한 왜 255자를 능가 할 수 없습니까? 액세스 테이블에 이것을 문자열 필드로 저장하는 경우, 표현식의 절반을 1 필드에, 후반에는 다른 절반을 넣을 수 있습니다.

또한 Antlr, YACC 또는 이와 유사하게 표현을 구문 분석하고 구문 분석 트리를 만들 수 있습니다. 이 나무들은 일반적으로 괄호를 최적화합니다. 그러면 나무에서 다시 표현을 만들어야합니다 (괄호없이).

그래도이 일을하는 데 몇 시간이 걸릴 수 있습니다. 그러나 표현 구문 분석은 일반적으로 일반 구문 분석의 첫 번째 예이므로 샘플을 가져 와서 필요에 맞게 수정할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top