lintcode----最高频的k个单词

题目描述:
给一个单词列表,求出这个列表中出现频次最高的K个单词。

注意事项:
你需要按照单词的词频排序后输出,越高频的词排在越前面。如果两个单词出现的次数相同,则词典序小的排在前面。

样例:
给出单词列表:

[ “yes”, “lint”, “code”, “yes”, “code”, “baby”, “you”, “baby”, “chrome”, “safari”, “lint”, “code”, “body”, “lint”, “code” ]

如果 k = 3, 返回 [“code”, “lint”, “baby”]。
如果 k = 4, 返回 [“code”, “lint”, “baby”, “yes”]。

思路讲解:
自从发现了优先队列这个东西,我发现做这样类似的题,都可以直接套用优先队列,只不过这道题并不是简简单单的使用优先队列就够了,这里我们首先要统计各个单词出现的次数,这里我们使用的是STL中的set来进行查找,其查找的时间复杂度是log(n),首先如果找到了,就将其次数加一,没有找到就将其加入set中,并也将其加入数组中,这里还有一个问题就是关于获取单词在数组中的位置,因为我们加一的时候,我们需要判断其是对哪一个单词对应的个数加一,这里我们就需要使用哈希表了,将单词与其在数组中的位置进行映射,这样我们就可以得到我们想要单词的位置了,然后我们思考一下单词与其次数我们是使用两个数组呢,还是使用结构体呢,我这里使用的是结构体,由于我们后面需要利用优先队列,所以我们只能使用结构体,使用了结构体,这里我们就需要自定义优先队列的排序函数了,首先根据次数排序,如果次数一样,就根据单词的词典序排序。

代码详解:


struct str_count{
    string str;
    int num;
};

struct cmp{
    bool operator()(str_count a,str_count b){

        if(a.num!=b.num){
            return (a.num<b.num);
        }else{
            return (a.str>b.str);
        }
    }
};
class Solution {
public:
    /**
     * @param words: an array of string
     * @param k: An integer
     * @return: an array of string
     */
    vector<string> topKFrequentWords(vector<string> &words, int k) {
        // write your code here

        set<string>hm;//存储字符串并用来统计字符串出现的次数

        unordered_map<string,int>hm2;//将字符串与其在数组中的位置形成映射,方便下面的通过字符串找到其位置


        vector<str_count>store_for_str_num;//将所有出现的字符串都保存下来,方便下面的优先队列的使用

        int len=words.size();

        int flag=0;
        for(int i=0;i<len;i++){

            if(i==0){//第一次hm是空的,特殊处理

                hm.insert(words[i]);
                hm2[words[i]]=flag;
                str_count temp;
                temp.str=words[i];
                temp.num=1;
                store_for_str_num.push_back(temp);
                flag++;

            }else{

                if(hm.find(words[i])!=hm.end()){//首选在hm中查找下,是否存在,如果存在就将其出现次数加一

                    store_for_str_num[hm2[words[i]]].num++;

                }else{//不存在,就将其加入hm中,并在数组以及hm2中添加其信息

                    hm.insert(words[i]);
                    hm2[words[i]]=flag;
                    str_count temp;
                    temp.str=words[i];
                    temp.num=1;
                    store_for_str_num.push_back(temp);
                    flag++;

                }
            }
        }//处理好了所有的数据,数据转换成了str_count类型的,字符串与次数的结构体

        priority_queue<str_count,vector<str_count>,cmp>q;//利用优先队列,得到其排序,这里自定义了排序方法
        for(int i=0;i<store_for_str_num.size();i++){
            q.push(store_for_str_num[i]);
        }

        vector<string>res;
        for(int i=0;i<k;i++){//将优先队列的前k取出,其就是最终结果
            str_count temp=q.top();
            q.pop();
            res.push_back(temp.str);
        }
        return res;
    }
};
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: f-k变换是一种在时频域中对信号进行分析的方法,它可以用于提取信号中的频率分量和空间分布信息。在MATLAB中,可以使用快速傅里叶变换(FFT)函数来实现f-k变换。 首先,我们需要从信号中获取到时域数据。假设我们有一个时间序列信号x(t),通过采样得到了N个数据点。 接下来,我们可以使用MATLAB中的FFT函数将时域信号转换为频域信号。在频域中,我们获得了信号的幅度谱和相位谱信息。 fft_x = fft(x); 频域中的数据是以频率为索引的,从0到N-1。如果我们要获得频率-波数域(f-k域)的幅度谱和相位谱信息,我们需要对频域数据进行重新排列。 fk_x = fftshift(fft_x); 然后,我们可以使用MATLAB中的fftshift函数对频域数据进行中心化操作。这个操作可以将频域数据重新排列,使得频率在正负频率范围内相互对称。这样,我们可以更好地观察信号的频率与波数之间的关系。 最后,我们可以绘制f-k域的幅度谱和相位谱图像。可以使用MATLAB中的imagesc函数来生成彩色图像,并使用colorbar函数添加颜色刻度。 figure; subplot(1, 2, 1); imagesc(abs(fk_x)); colorbar; title('f-k域的幅度谱'); xlabel('波数'); ylabel('频率'); subplot(1, 2, 2); imagesc(angle(fk_x)); colorbar; title('f-k域的相位谱'); xlabel('波数'); ylabel('频率'); 通过这些步骤,我们就可以在MATLAB中实现f-k变换,并获得信号在频率-波数域中的幅度谱和相位谱信息。 ### 回答2: f-k变换是一种常用的时域到频域的信号处理方法,在MATLAB中可以实现。 首先,需要导入信号数据并进行时域采样。可以使用MATLAB中的信号处理工具箱提供的函数来读取音频文件或生成合成信号。通过声音信号处理工具箱中的`audioread`函数,可以读取音频文件并将其转换为离散的时域信号。 然后,使用傅里叶变换将时域信号转换为频域信号。可以使用MATLAB中的`fft`函数来计算离散傅里叶变换(DFT)。该函数将时域信号作为输入,并返回相应的频域信号。 接着,进行f-k变换。f-k变换将频域信号转换为k-域信号,其中k表示频率的空间域。可以使用MATLAB中的`fftshift`函数来进行f-k变换。该函数将频域信号作为输入,并将其重新排列以使低频成分位于频谱中心,高频成分位于频谱边缘。 最后,对k域信号进行逆变换,将其转换回时域信号。可以使用MATLAB中的`ifft`函数来计算逆傅里叶变换(IFT)。该函数将k域信号作为输入,并返回相应的时域信号。 综上所述,使用MATLAB实现f-k变换的步骤如下: 1. 导入信号数据并进行时域采样。 2. 使用`fft`函数将时域信号转换为频域信号。 3. 使用`fftshift`函数进行f-k变换。 4. 使用`ifft`函数将k域信号转换回时域信号。 通过这些步骤,就可以在MATLAB中实现f-k变换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值