-3

我只想编写用于比较一维数组和二维数组的代码......我正在编写一个编译器,并希望比较一个包含我的代码的一维数组和我在其中制作符号表的其他二维数组。我已经编写了代码,但它不起作用。

for (int x = 0; x < symboltable1.Length; x++)
{
    for (int y = 0; y < symboltable1.Length; y++)
    {
        for (int z = 0; z < text.Length; z++)
        {
            if (symboltable1[x,y] == text[z])
                listBox2.Items.Add(text[z]);
            else
                MessageBox.Show("poor");
        }
    }
}
4

2 回答 2

3

我认为您的错误可能在于检查数组长度。
尝试这个:

for (int x = 0; x < symboltable1.GetLength(0); x++)
{
    for (int y = 0; y < symboltable1.GetLength(1); y++)
    {
        for (int z = 0; z < text.Length; z++)
        {
            if (symboltable1[x,y] == text[z])
                listBox2.Items.Add(text[z]);
            else
                MessageBox.Show("poor");
        }
    }
}
于 2012-05-26T10:56:35.100 回答
0

您的方法太慢了 O(n*m*l) (其中l是文本的长度,n & m是符号表的尺寸。)

将符号表转换为排序索引表将为您提供 O(l*log(n*m)),而使用哈希表则几乎为 O(l)。

我实现了这三种方法只是为了好玩:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace test
{
    class Program
    {
        class IndexElement:IComparable<IndexElement>
        {
            public string value;
            public int x;
            public int y;
            public IndexElement(string v,int x,int y)
            {
                this.value = v;
                this.x = x;
                this.y = y;
            }

            public int CompareTo(IndexElement other)
            {
                return value.CompareTo(other.value);
            }
        }

        struct Position
        {
            public int x;
            public int y;
            public Position(int x, int y)
            {
                this.x = x;
                this.y = y;
            }
        }
        static void Main(string[] args)
        {
            string[,] symbols = new string[,] { { "if", "else" }, { "for", "foreach" }, { "while", "do" } };
            string[] text = new string[] { "for", "int", "in", "if", "then" };
            Dictionary<string, Position> dictionary = BuildDict(symbols);
            IndexElement[] index = BuildIndex(symbols);
            Console.WriteLine("Brute:");
            foreach (string s in CompareUsingBrute(text, symbols))
            {
                Console.WriteLine(s);
            }
            Console.WriteLine("Dict:");
            foreach (string s in CompareUsingIndex(text, dictionary))
            {
                Console.WriteLine(s);
            }
            Console.WriteLine("Indexing:");
            foreach (string s in CompareUsingDictionary(text, index))
            {
                Console.WriteLine(s);
            }
            Console.ReadKey();
        }

        private static List<string> CompareUsingBrute(string[] text, string[,] symbols)
        {
            List<string> res = new List<string>();
            for (int x = 0; x < symbols.GetLength(0); x++)
            {
                for (int y = 0; y < symbols.GetLength(1); y++)
                {
                    for (int z = 0; z < text.Length; z++)
                    {
                        if (symbols[x, y] == text[z])
                            res.Add(text[z]);                        
                    }
                }
            }
            return res;

        }

        private static List<string> CompareUsingDictionary(string[] text, IndexElement[] index)
        {
            List<string> res = new List<string>();
            foreach (string s in text)
            {
                if (Array.BinarySearch<IndexElement>(index, new IndexElement(s, 0, 0)) >= 0)
                {
                    res.Add(s);
                }
            }
            return res;
        }

        private static IndexElement[] BuildIndex(string[,] symbols)
        {
            IndexElement[] res = new IndexElement[symbols.Length];
            int index = 0;
            for (int i = 0; i < symbols.GetLength(0); i++)
            {
                for (int j = 0; j < symbols.GetLength(1); j++)
                {
                    res[index] = new IndexElement(symbols[i, j], i, j);
                    index++;
                }

            }
            Array.Sort(res);
            return res;
        }

        private static List<string> CompareUsingIndex(string[] text, Dictionary<string, Position> dictionary)
        {
            List<string> res = new List<string>();
            foreach (string s in text)
            {
                Position p;
                if (dictionary.TryGetValue(s,out p))
                {
                    res.Add(s);
                }
            }
            return res;
        }

        private static Dictionary<string, Position> BuildDict(string[,] symbols)
        {
            Dictionary<string, Position> res = new Dictionary<string, Position>();
            for (int i = 0; i < symbols.GetLength(0); i++)
            {
                for (int j = 0; j < symbols.GetLength(1); j++)
                {
                    res.Add(symbols[i, j], new Position(i, j));
                }
            }
            return res;
        }


    }
}
于 2012-05-26T11:02:30.827 回答