我如何加快“ mini-git”课程的学习速度?

时间:2019-09-16 17:08:30

标签: c# data-structures

我想构建一个Git类,我可以在其中存储int值(我们称它们为文件)。用filesCount传递给类的构造函数的要存储的文件数。我需要一个void Update(int fileNumber, int value)方法,一种int Commit()方法,该方法可以保存文件的当前状态并返回commitNumber(方法被称为减1的次数)。最后但并非最不重要的int Checkout(int fileNumber, int commitNumber)几乎是不言而喻的。 我需要此类快速而有效地利用内存。我当前的解决方案对于int Checkout(int commitNumber, int fileNumber)来说太慢了。 这是:

using System.Collections.Generic;
using System.Linq;
using System;

namespace GitTask
{
    public class Git
    {
        int[] Files { get; set; }
        Dictionary<int[], List<int>> Commits { get; set; }
        int CommitsCount { get; set; }

        public Git(int filesCount)
        {
            Files = new int[filesCount];
            Commits = new Dictionary<int[], List<int>>(new MyEqualityComparer());
        }

        public void Update(int fileNumber, int value)
        {
            Files[fileNumber] = value;
        }

        public int Commit()
        {
            var temp = new int[Files.Count()];
            Array.Copy(Files, temp, Files.Count());
            if (Commits.ContainsKey(temp))
            {
                Commits[temp].Add(CommitsCount);
            }
            else
            {
                Commits[temp] = new List<int>(new int[] { CommitsCount });
            }
            CommitsCount++;
            return CommitsCount - 1;
        }

        public int Checkout(int commitNumber, int fileNumber)
        {
            if (commitNumber >= CommitsCount)
                throw new ArgumentException();
            else
            {
                var k = Commits.FirstOrDefault(x => x.Value.BinarySearch(commitNumber) > -1).Key;
                return k[fileNumber];
            }
        }
    }

    public class MyEqualityComparer : IEqualityComparer<int[]>
    {
        public bool Equals(int[] x, int[] y)
        {
            if (x.Length != y.Length)
            {
                return false;
            }
            for (int i = 0; i < x.Length; i++)
            {
                if (x[i] != y[i])
                {
                    return false;
                }
            }
            return true;
        }

        public int GetHashCode(int[] obj)
        {
            int result = 17;
            for (int i = 0; i < obj.Length; i++)
            {
                result = result * 23 + obj[i];
            }
            return result;
        }
    }
}

我希望您能提出加速或创建这种存储文件的技巧(使用Dictionary<int[], List<int>)可能已经快了。

int Commit()方法的一些解释以及使用此字典的一般目的。由于我需要存储数字,因此我决定仅在字典中存储唯一数组,并将它们用作键,并且值是List<int>,其中包含响应该数字数组的提交数字,因此我只能存储一个唯一数组时间并有提交号。

0 个答案:

没有答案