某种语法解析但没有暴力

时间:2016-11-10 17:04:18

标签: algorithm parsing

我有一个“转换”/“语法”列表,无论你怎么称呼它:

L - >大号| LL | N

这意味着L(字母)可以转换为1个字母或2个字母S或一个N(数字)

我给出了一个转换列表和一系列数字以及执行的INITIAL移动,我必须生成生成给定数字序列的最小移动列表。

 import UIKit
 import CoreLocation

 struct TokyoLocationConstants {
     static let cityLat = 35.6895
     static let cityLong = 139.6917
   }

 class ViewController: UIViewController, CLLocationManagerDelegate {

      let obj1 = CLLocationManager()
      var degrees: Double = 0

   override func viewDidLoad() {

        obj1.startUpdatingLocation()
        obj1.startUpdatingHeading()
 }

  func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    timeToGetTheDirection(location: locations.last!)
 }

   func timeToGetTheDirection(location: CLLocation) {

    let lat1 = location.coordinate.latitude // My current Latitude
    let long1 = location.coordinate.longitude // My current Longitude


    // Fromula to get the direction to a city from this site:
    // http://www.movable-type.co.uk/scripts/latlong.html

    let differenceInLong = TokyoLocationConstants.cityLong - long1

    let y = sin(differenceInLong) * cos(TokyoLocationConstants.cityLat)
    let x = cos(lat1) * sin(TokyoLocationConstants.cityLat) - sin(lat1) * cos(TokyoLocationConstants.cityLat) * cos(differenceInLong)

    let theAngleInRad = atan2(y, x)
    var theAngleInDeg = theAngleInRad * (180 / M_PI)

    if(theAngleInDeg < 0){
        theAngleInDeg = -theAngleInDeg;
    } // End of Formulla

    degrees = theAngleInDeg; // Assign the result of formula above to global var to be used below
}

   func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {

    var rad: Double = 0


    if newHeading.trueHeading > 0 {  
     // This will make the 1st arrow points to the North

        rad = newHeading.trueHeading * (M_PI / 180)
       imageView.transform = CGAffineTransform(rotationAngle: CGFloat(-rad))
    }

      // This will make the 2nd arrow points to the City

    let cityDegreeInRad = (M_PI / 180 ) * degrees
    let something = (newHeading.trueHeading - (cityDegreeInRad))

    lineImageView.transform = CGAffineTransform(rotationAngle: CGFloat(-something))
}

没有循环,例如A-> AB或A-> B,B-> A等 蛮力不是一种选择,因为转换的输入大~1000,生成的序列是~30。

在互联网上进行了广泛的搜索之后,我找到了CYK算法,但是在我的例子中使用它后,结果是序列2403不在语法中(这是错误的)。

我真的不明白我该怎么办?我正在努力解决这个问题。欢迎任何帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

在您申请CYK之前,语法必须位于Chomsky normal form,这意味着您需要eliminate the unit rules

换句话说,必须将规则B->D转换为两个规则:B->2B->3。同样,规则C->F必须转换为C->4

一旦你对语法进行了这些调整,它将采用乔姆斯基的正常形式,因此CYK将起作用。当然,在显示解析器结果时,只要您调用其中一个转换后的规则,就需要生成两行输出。例如,B->2的调用应显示为B->D,后跟D->2