后缀数组二倍增模板解析

后缀数组模板解析

    自己的理解和分析 如有错误或不同的理解请指出。

    int cmp(int *r, int a, int b, int k)

    {

        return r[a] == r[b]&&r[a + k] == r[b + k];

    }

    void getsa(int *r, int *sa, int n, int m)

    {

        int i, j, p, *x = wa, *y = wb, *t;  

        for(i = 0;i < m;i++)

            wsf[i] = 0;

        for(i = 0;i < n;i++)

            wsf[x[i] = r[i]]++;

        for(i = 1;i < m;i++)

            wsf[i] += wsf[i - 1];

        for(i = n - 1;i >= 0;i--)

            sa[--wsf[x[i]]] = i;

      基基排序。(基数排序)

      X[i]数组记录的是一开始的r[i]的值。 

      Wsf[i]数组记录的是值为i和小于i的元素有几个。

      最后一个循环则是记录排第几的数的位置。

 

        j = 1;

        p = 1;

        for(;p < n;j *= 2, m = p)

        {

            for(p = 0, i = n - j;i < n;i++)

                y[p++] = i;

            for(i = 0;i < n;i++)

                 if(sa[i] >= j)

                     y[p++] = sa[i] - j;

      Y[i]记录的是排名为i的第二要素的第一要素位置。

      Sa[i]记录的是上一次排序的元素排名第i的元素的位置。

      因为是二倍增排序,j就是第二要素据第一要素的距离,所以n-j第一元素的第二元素都为零,所以排名直接从零开始。

      第二个for循环就是单纯的记录第二要素的排名。至于为什么sa[i]>=j是因为j前面的元素不肯能作为第二元素。

            for(i = 0;i < n;i++)

                wv[i] = x[y[i]];

            for(i = 0;i < m;i++)

                wsf[i] = 0;

            for(i = 0;i < n;i++)

                 wsf[wv[i]]++;

            for(i = 1;i < m;i++)

                 wsf[i] += wsf[i - 1];

            for(i = n - 1;i >= 0;i--)

                sa[--wsf[wv[i]]] = y[i];

    与一开始一样 是基基排序。至于第一个for循环则是根据第二元素进行了排序然后赋值。因为最后一个for循环是从后往前的所以先扫到的排名低,所以要构成一个新的数列。

    同样的 因为第一个for循环 所以最后一个for循环就是=y[i].因为y[i]表示的是第二元素排名第i位的第一元素的位置.sa[i]数组记录的是排名第i位的原数组的位置。

            t = x;

            x = y;

            y = t;

            x[sa[0]] = 0;

            for(i = 1, p = 1;i < n;i++)

                 x[sa[i]] = cmp(y, sa[i - 1], sa[i], j) ? p - 1: p++;

        }

    }

    数组交换.

    因为一开始人为的加入了x[末尾+1] = 0;0肯定是排在第0位的,所以x[sa[0]] = 0;只是再加一遍而已。这里p 的值表示的是不同关键值得数量。

    void getheight(int *r, int n)

    {

        int i, j, k = 0;

        for(i = 1; i <= n;i++)

             rank[sa[i]] = i;

      求出rank数组,rank[i]的意思是位置为i的后缀的排名,与sa[i]数组正好互逆。

      for(i = 0; i < n;i++)

      {

            if(k)

                k--;

            else

                k = 0;

            j = sa[rank[i] - 1];

            while(r[i + k] == r[j + k])

                k++;

            height[rank[i]] = k;

        }

    }

      J是位置为i的后缀排名前一名的位置。如果这两个字符相等边加一。

                                  

                                                                                             2015.7.9 by Eson

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值