2009-06-30 3 views
4

안녕하세요 저는 수학 공식에서 불필요한 괄호를 제거하는 알려진 방법이 있는지 궁금합니다. 나는이 질문을하고 그 이유는 내가 기본적으로 SQL SELECT 문의 일부입니다 같은 식 길이수학 표현식에서 불필요한 괄호를 없애는 방법

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

을 최소화해야한다는 것입니다. 255자를 초과 할 수 없으며이 수식을 생성하는 코드를 수정할 수 없습니다 (기본적으로 블랙 박스;) 많은 괄호는 쓸모가 없습니다. 사실을 언급하지 않는다 :

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

그래서 나는 연산 순서를 유지하려고한다. 괄호, 곱하기/나눗셈, 더하기/빼기.

임씨는 VB에서 작업하지만 모든 언어의 솔루션은 문제가되지 않습니다.

편집 나는 반대 문제 (식이 괄호를 추가) Question을 발견했다.

나는 이것이 무거운 파싱없이 수행 될 수 있다고 생각했습니다. 그러나 표현식을 거쳐 표현식 트리에 저장하는 일부 구문 분석기는 불가피합니다.

답변

2

당신은 간단한 케이스를 벗겨 수를 저장하는 중간 변수를 사용할 수 있습니다 ] 테이블 이름 또는 별칭 주위에.

당신이 열 별칭을 할 수 있다면 당신은 그것을 더 단축 할 수있다 : 심지어

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 코드이지만, 당신은 내가이 스레드는 정말 오래 알고있는 전체 문장

+0

Keith. 나는 그것을 줄 것이다. – Pawel

0

나는 어떤 괄호가 불필요한지를 결정하기 위해 을 가지고 있습니다. 괄호를 중첩 할 수 있기 때문에 정규 표현식이 얕은 방식으로 만 처리 할 수있는 반복적 인 문제이며 부정확 한 결과가 발생할 가능성이 높습니다. 이미 표현식을 평가하고 있다면 가능한 경우 수식을 단순화하고 싶을 것입니다. 또한 다소 까다로워지며 일부 접근법에서는 다음과 같은 기계 학습에서 볼 수있는 기술을 사용합니다. http://portal.acm.org/citation.cfm?id=1005298

0

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

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

또한 255자를 초과 할 수없는 이유는 무엇입니까? 이것을 Access 테이블의 문자열 필드로 저장하면 1 필드에 표현식의 절반을 넣고 다른 하나는 두 번째 테이블에 넣을 수 있습니다.

0

또한 ANTLR, yacc 또는 유사한 구문을 사용하여 구문 분석을 시도하고 구문 분석 트리를 만들 수도 있습니다. 이 나무들은 일반적으로 괄호를 멀리 둡니다. 그렇다면 트리에서 표현식을 만들어야합니다 (분명히 괄호없이).

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

1

표현식에서 불필요한 괄호를 제거하려는 경우 일반 솔루션은 텍스트를 구문 분석하고 연결된 표현식 트리를 작성하는 것으로 구성됩니다.노드가 "+", 더 괄호가 필요하지 않습니다

  • 경우 경우

    • :

      그런 다음,이 나무에서, 당신은 몇 가지 규칙을 적용하여 비 필요한 괄호없이 해당 텍스트를 찾을 수 있습니다 노드는 왼쪽 (오른쪽)의 자녀가있는 경우에만 다음 괄호는 왼쪽 (오른쪽) 자녀에 대한 요구된다 "*"있는 "+"동일 "/"

    위한 그러나 경우에 적용

  • 당신의 문제는 이것들을 다루는 것입니다.

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

    v.[6432] 
    

    당신은 [을 필요가 없습니다되다 : 255 자, 당신은 아마 중간 결과

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

    를 단순화해야하지만, 그것은에서 검색 가능으로 구글.

    비슷한 문제를 해결하는 TI-83 plus 계산기 프로그램을 작성 중입니다. 내 경우에는 실제로 특정 변수에 대한 수식을 풀기 위해 노력하고 있지만 배열을 사용하고 있지만 문제와 관련 될 수 있으므로 특정 값을 선택하는 것이 더 쉬울 수도 있습니다. ..
    아주 잘된 것은 아니지만 다소 우아한 솔루션 인 (나는 생각합니다.) 대다수의 괄호를 제거합니다.

    내가하는 일은 방정식/함수/모든 것을 열어 각 여는 괄호를 추적하는 것입니다. "(내가 닫는 괄호를 찾을 때까지") "어느 지점에서 나는 내가 뛰어 들어 가지 않을 것이라고 확신 할 수 있습니다. 더 깊게 중첩 된 parenthese.

    y = ((3x + (2)))는 (2)를 먼저 표시 한 다음 (3x + (2))를 표시 한 다음 ((3x + 2)))를 표시합니다.

    다음은 각 괄호 앞뒤의 값을 확인합니다. 위의 경우 +와)를 반환합니다. 각각에 숫자 값이 지정됩니다. 두 사람 사이에는 높은 사람이 사용됩니다. 연산자가 발견되지 않으면 (*, /, +,^또는 -) 기본값 인 0을 사용합니다.

    다음으로 괄호 안을 스캔합니다. 이 경우에는 가장 높은 값이 아닌 가장 낮은 값을 사용하지만 유사한 번호 매기기 시스템을 사용합니다. 위의 경우와 같이 아무것도 찾지 못하면 기본값은 5입니다.

    두 값을 빼서 괄호의 중요도에 숫자를 할당 할 수 있습니다. 만약 당신이 괄호 바깥에^^와 비슷한 것을 가지고 있다면 (2 + 3)^5 이 괄호는 잠재적으로 매우 중요하며, 높은 가치를 부여 할 것입니다. (내 프로그램에서 ^를 5 번 사용합니다).

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

    위의 단점은 방정식을 여러 번 스캔하면 (적어도 TI-83에서는) 엄청나게 느리다는 것입니다. 그러나 속도가 문제가되지 않는다면 ... 그게 도움이 될지 모르겠다. 나는 완전히 주제에서 벗어날지도 모른다. 당신이 모든 일을하고 일하기를 바래요.