文本向量化研究现状总结,从独热编码到预训练模型

193 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情

前言

把看过的模型总结一下吧,方便以后看。

思路

因为是三个数,且把012排序,那么可以利用快排3.0的merge部分,解决荷兰国旗问题。

荷兰国旗 只有三种颜色 0 1 2 为每一种颜色分配一个区域 把最中间的颜色1视为target 则分成的三个区域为: 分别是 num<target => less区域 num== target =>target区域 num>target =>more区域 遍历数组中的元素(颜色) 当此时的值小于target 则当前值与less区域的边界交换 然后扩展less区域,将目标值纳入less区域中 若当前值大于target 则当前值与more区域的边界交换 然后扩展more区域,将目标值纳入more区域 等于target 不做任何调换操作 continue; 此处撰写解题思路

代码

--javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int left=0;
        int right=nums.size()-1;
        int less=left-1;//小于区域右边界
        int more=right+1;//大于区域左边界
        int p=1;
        while(left< more){
            if(nums[left]<p){
                swap(nums[++less],nums[left++]);
            } else if(nums[left]>p){
                swap(nums[--more],nums[left]);
            }else{
                left++;
            }
        }

    }
};

0.为什么是栈

因为要后进先出的元素与当前元素做比较。

1.map和unordered_map的不同

1.1 使用方法不同

使用方法是最直观的区别,这两种结构虽然都在STL库中,但是所使用的头文件不同。 map:#include<map> unordered_map:#include <unordered_map>

1.2数据结构不同

map是基于红黑树结构实现的。 unordered_map是基于哈希表(也叫散列表)实现的。

1.3元素排列顺序不同

map:基于红黑树,元素有序存储 unordered_map:基于散列表,元素无序存储

1.4插入和查询的时间复杂度不同

map:基于红黑树,复杂度与树高相同,即O(logn)。 unordered_map:基于散列表,复杂度依赖于散列函数产生的冲突多少,但大多数情况下其复杂度接近于O(1)。

1.5效率及其稳定性不同

这点实际上也是由底层的数据结构决定的。

存储空间:unordered_map的散列空间会存在部分未被使用的位置,所以其内存效率不是100%的。而map的红黑树的内存效率接近于100%。 查找性能的稳定性:map的查找类似于平衡二叉树的查找,其性能十分稳定。例如在1M数据中查找一个元素,需要多少次比较呢?20次。map的查找次数几乎与存储数据的分布与大小无关。而unordered_map依赖于散列表,如果哈希函数映射的关键码出现的冲突过多,则最坏时间复杂度可以达到是O(n)。因此unordered_map的查找次数是与存储数据的分布与大小有密切关系的,它的效率是不稳定的。

结语

map和unordered_map并无好坏之分,它们都有各自应用的场景。它们之间的区别归根结底来源于使用的数据结构不同。
最后一句话,总结一下它们的适用场景: 在需要元素有序性或者对单次查询性能要求较为敏感时,请使用map,其余情况下应使用unordered_map。 因此在需要使用字典结构进行算法编程的大部分情况下,都需要使用unordered_map而不是map。

2.代码说明

--javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

    bool isValid(string s) {
        map<char,int> m={{'(',1},{')',-1},{'[',2},{']',-2},{'{',3},{'}',-3}}; 
        stack<char> sta;
        for(char c:s){
            if(!sta.empty()){
                if(m[c]>0){  //大于0说明是左括号直接进栈
                    sta.push(c);
                }
                else if(-m[c]==m[sta.top()]) { //判断栈顶是不是和当前右括号匹配
                    sta.pop();
                }else{ //不匹配返回false
                    return false;
                }
            } else{ 
                if(m[c]<0){ //空的栈,还进来个右括号,直接false
                    return false;
                }
                sta.push(c);
            }
        }
        return sta.empty();
    }