【c++】——海量数据处理各种面试题(位图的实现和应用,布隆过滤器的应用,哈希切分)

2023-11-15

目录

一. 位图

1.1 位图的概念

 1.2 位图的使用场景

题目一

题目二

 题目三

题目四

二. 布隆过滤器

2.1 布隆过滤器的概念

2.2 布隆过滤器优点

2.3 布隆过滤器缺点

2.4 布隆过滤器使用场景

问题五

问题六

 问题七


一. 位图

1.1 位图的概念

位图是内存中连续二进制bit,然后对海量整数的去重和查询。 在位图中,位图的下标是整数,所以整数映射到位图是位图的下标,位图存储的内容是0和1,0代表这个下标这个数是不存在的,1代表下标这个整数是存在的。我举个例子,给定长度为8bit大小的位图,将3,5,7这几个整数映射到该位图中,应该怎样做呢?

ps(蓝色代表的是0,橙色代表的是1)

将3映射到位图中,找到位图的3下标,然后将3位置的bit位设置为1. 

 将5映射到位图中,找到位图的中5的下标,然后将5位置的bit位设置为1. 

将7映射到位图中,找到位图中7的下标,然后将7位置的bit位设置为1. 

 位图的实现:

位图的映射

一个char是8个bit位,如果整数10要映射到位图中,就需要找到第二个char数据,然后在找到第二个char的第二个bit位,并将其改变为1即可。任何数 | 1都为1,| 0为原来的数。

namespace sjp
{
	//定义一个非类型模板参数
	template<size_t N>
	class SetBit
	{
	private:
		vector<char> v;//一个char为8个bit位
	public:
		SetBit()
		{
			v.resize(N / 8 + 1);//开辟N个bit位
		}

		void Set(size_t x)//将x映射到位图中
		{	
			//找相对应的位图下标
			int index = x / 8 + 1;//x在位图中的第几个char中
			int place = x % 8;//在这个数的第几个bit位

			v[index] |=(1 << place);
		}

		//删除x在位图中的映射
		void ReSet(size_t x)
		{
			//找相对应的位图下标
			int index = x / 8 + 1;//x在位图中的第几个char中
			int place = x % 8;//在这个数的第几个bit位

			v[index] &=(~(1 << place));
		}

		//判断一个数据是否在位图中
		bool Test(size_t x)
		{
			//找相对应的位图下标
			int index = x / 8 + 1;//x在位图中的第几个char中
			int place = x % 8;//在这个数的第几个bit位
			return v[index] &(1 << place);
		}
	};
//}

 1.2 位图的使用场景

题目一

磁盘中有40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。

思路一:将所有的数据都加载到内存中,然后对其遍历。时间复杂度为O(N)。

思路二:将所有的数据都加载到内存中,并存储在under_set中,然后通过映射关系找到它,时间复杂度为O(1).

然而这上面两种情况,在正常计算机是不可能实现的,因为计算机中的内存一般为4g或者8g,而

40亿个整数大概是16g,所以是不可能同时将40亿个无符号整数加载到内存中。

因此所以我们是不可能将40亿个无符号整数同时加载到内存。但我们可以在内存中定义一个位图,将磁盘上的无符号整数数都映射到位图中,然后通过位图去判断无符号整数是否存在,因为是无符号整数范围是0~4294967295,所以需要定义一个4294967295bit大小的位图来映射这40亿个整数。

4294967295在32位下的计算机大概为500mb。相比于16G来说,位图的大小会小很多。

 

程序运行起来后所占用的内存空间: 

 

题目二

1. 给定100亿个整数,设计算法找到只出现一次的整数?

在这100亿个整数中,我们可以将这些整数出现的次数可以分成3类。

  1. 一次都没有出现的整数
  2. 只出现一次的整数
  3. 出现过两次及以上的整数

所以我们可以定义位图一位图二对这三种情况进行标记,数的大小代表两个位图的下标。

  1. 如果一次都没有出现的整数,那么它在两个位图中的都表示为1.
  2. 如果只出现一次的整数,那么它在位图一标记为1,在位图二上标记为0.
  3. 如果出现过两次及以上的整数,那么在位图一上标记为0,在位图二上标记为1.

代码实现

	class DoubleBM
	{
	private:
		SetBit<-1> s1;
		SetBit<-1> s2;
		vector<int> v;
	public:
		DoubleBM()
		{
		}

		void SetDB(size_t x)//将所有的数都映射到位图上
		{
			if (!s1.Test(x) && !s2.Test(x))
			{
				s1.Set(x);
			}
			else if (s1.Test(x) && !s2.Test(x))
			{
				s1.ReSet(x);
				s2.Set(x);
			}
		}

		bool Test(size_t x)//判断一个整数是否只出现一次
		{
			if (s1.Test(x) && !s2.Test(x))
			{
				return true;
			}
			return false;
		}
	};
}

 题目三

给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?

方案一:

如果是32位整数,那么可以在内存中创建一个位图,大概是500mb,然后将第一文件中的所有数据映射位图中,如果存在则为1,不存在则为0,然后再将第二个文件中的所有数据与位图进行对比,如果对比到的位置是1,说明该数是两个整数的交集,然后将交集的数据放在第三个文件中。

方案二:哈希切分

将文件1中所有数据通过哈希函数分成1000个小文件,每个文件大约有1000万个整数,大约为40mb,小文件a0,a1,a2...a999,数据通过哈希函数得到的结果就是文件的下标,例如文件a1代表的是整数余数为1的文件,a999代表的是余数为999的文件。然后将文件2中所有数据也通过哈希函数分成1000个小文件,小文件b0,b1,b2...b999,数据通过哈希函数得到的结果就是文件的下标,文件b1代表的是整数余数为1的文件,b999代表的是余数为999的文件,因为两个文件都使用相同的哈希函数,所以两个文件中相同的整数会被分配到下标一致的小文件中,然后将a1和b1就交集,a2和b2求交集,ai和bi求交集。求交集的方法,可以在内存中创建一个under_set数据结构,通过映射的关系求出交集,将交集的数据放在一个新的文件中。

题目四

1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数?

方案一:位图

使用两个位图,分别是位图1和位图2,一个为位图大概为500mb,来记录所有整数出现的次数,在这100亿个数据当中,数据出现的可能次数有:

  • 0次,两个位图都记录为0;
  • 1次,位图1中记录1,位图2记录为0;
  • 2次,位图1中记录为0,位图2记录为1;
  • 3次及3次及三次以上,位图1和位图2都记录为1;

将文件中的所有值映射到位图后,然后再找出位图1和位图2中都不全为1就是不超过2次的整数。

方案二:哈希切分法

100亿个整数大小大约为40g,创建80个小文件,分别标记为a0,a1,a2...a79,然后对大文件中每个整数都%80,得出的结果就放到相对应的小文件中,如得81%80=1,则81放在a1中,所有相同的整数都会放在一个小文件中,然后将一个一个的小文件加载到内存中,统计每个小文件中不出现2次的整数,然后将这些统计出来的整数统一放在一个文件中。

二. 布隆过滤器

2.1 布隆过滤器的概念

 布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”,它是用多个哈希函数,将一个数据映射到位图结构中。这种方式不仅可以提升查询效率,也可以节省大量的空间。

布隆过滤器主要是将字符串等其他数据映射到位图中,但是位图只能映射整数,所以我们需要通过哈希函数将字符串变量转换为整数映射到位图中(ps:哈希函数是将字符串类型转换为整数的函数),但不同的字符串利用哈希函数转换为整数有可能冲突的,导致不同字符串映射到位图中相同的位置上,为了减少这种冲突,我们可以利用不同的哈希函数将字符串转换为不同的整数,再将转换的整数都映射到位图中,最后一个字符串在位图中对应的多个整数。如下:假设“张三“这个字符串通过哈希函数1转换为20,通过哈希函数2转换为45,

通过哈希函数3转换为89,然后将这转换的3个整数都映射到位图中,当要判断”张三“这个字符串是否存在时,需要判断这3个整数是否都存在,如果其中一个整数不存在,则该字符串就不存在。

 也就是说,在布隆过滤器中,每个字符串都会转换成多个不同的整数,目的是减少映射冲突。当然冲突的概率是一定会存在,这是不可避免的。如下:

 例如:要判断"王五"是否存在,王五通过哈希函数转换成整数有:20,89,92,发现位图的对应的位置都已经被”张三"和"李四"给占用了,此时就会判断王五已经存在了。因此布隆过滤器判断某个字符串"存在",代表的是不一定真正的存在。但是如果布隆过滤器判断某个字符串不存在,那么它一定是不存在的,因为字符串转换的整数映射到位图中只要一个不存在,那么该字符串是一定不存在的。例如:假设”田七"通过哈希函数转换为整数位20,92,98,其中98中那个位置为0,则说明田七这个字符串一定不存在。

各种字符哈希函数的冲突率博客介绍: 

各种字符串Hash函数 - clq - 博客园

其中BKDRHash,APHash,DJBHash冲突率是比较低,因此我们选择这三个哈希函数来实现我们的布隆过滤器。        

布隆过滤器的实现

下面使用三种哈希函数将字符串转换为整数的布隆过滤器。(可以使用多个哈希函数)

#include"Setbit.hpp"


struct BKDRHash
{
	BKDRHash()//字符串哈希函数1
	{
	}
	size_t operator()(const string& str)
	{
		 size_t hash = 0;
		for(auto ch:str)
		{
			hash = hash * 131 + ch;   // 也可以乘以31、131、1313、13131、131313..          
		}
		return hash;
	}
};


struct APHash
{
	APHash()//字符串哈希函数2
	{}
	size_t operator()(const string str)
	{
		register size_t hash = 0;
		size_t ch;
		for (long i = 0; i<str.size(); i++)
		{
			ch = str[i];
			if ((i & 1) == 0)
			{
				hash ^= ((hash << 7) ^ ch ^ (hash >> 3));
			}
			else
			{
				hash ^= (~((hash << 11) ^ ch ^ (hash >> 5)));
			}
		}
		return hash;
	}
};

struct DJBHash
{
	DJBHash()//字符串哈希函数3
	{
	}
	size_t operator()(const string& str)
	{
		size_t hash = 5381;
		for (auto ch : str)
		{
			hash += (hash << 5) + ch;
		}	
		return hash;
	}
};



template<size_t N, class K = string,
	class Hash1= BKDRHash,
	class Hash2= APHash,
	class Hash3= DJBHash>
class BloomFilter
{
private:
	sjp:: SetBit<N> _bitset;
public:
	void Set(const K& s)//对字符串建立映射
	{
		//将字符串转换为3个整数
		size_t	i1 = Hash1()(s)%N;
		size_t	i2 = Hash2()(s)%N;
		size_t	i3 = Hash3()(s)%N;
		//将3个整数映射到位图中
		_bitset.Set(i1);
		_bitset.Set(i2);
		_bitset.Set(i3);
	}

	bool Test(const K& s)
	{
		size_t	i1 = Hash1()(s)%N;
		size_t	i2 = Hash2()(s)%N;
		size_t	i3 = Hash3()(s)%N;
		//如果有一个数据在位图是不存在的,则说明该数据不存在
		if (!_bitset.Test(i1))
		{
			return false;
		}
		if (!_bitset.Test(i2))
		{
			return false;
		}
		 if(!_bitset.Test(i3))
		{
			 return false;
		}
		 //如果所有数据在位图中都存在,则说明该字符串存在。
		 return true;
	}
};

测试代码: 

将100个字符映射到位图中,然后再检查不同的10000个字符串是否与位图中的字符串发生冲突。

int main()
{
	BloomFilter<500> bf;
	vector<string> v1;
	//将100个字符串映射到布隆过滤器中
	for (int i = 0; i < 100; i++)
	{
		string s = "shen jia peng";
		s +=to_string(1234+i);
		v1.push_back(s);
	}
	
	for (auto& str : v1)
	{
		bf.Set(str);
	}

	//测试10000个字符串是否与位图中的字符串冲突的概率
	int N = 10000;
	vector<string> v2;
	for (int i = 0; i <N; i++)
	{
		string s = "hello world";
		s += to_string(1234 + i);
		v2.push_back(s);
	}

	int sz = 0;
	for (auto& n : v2)
	{
		if (bf.Test(n))
		{
			sz++;
		}
	}
	cout << "冲突个数:" << sz << endl;
	cout << "冲突率:" << (double)sz /(double) N << endl;
}

结果

 在开辟2000个bit位,10000个字符串冲突的概率是32个,冲突概率是挺低的,也就是说1个字符串在位图中只需要3个字节就可以进行映射。并且冲突率还是可以接受的。

2.2 布隆过滤器优点

  1. 增加和查询元素的时间复杂度为:O(K), (K为哈希函数的个数,一般比较小),与数据量大小无关
  2.  数据量很大时,布隆过滤器可以表示全集,其他数据结构不能 
  3. 使用同一组散列函数的布隆过滤器可以进行交、并、差运算
  4. 布隆过滤器不需要存储元素本身,在某些对保密要求比较严格的场合有很大优势

2.3 布隆过滤器缺点

  1. 存在误判,判断 “在” 是不准确的,判断“不在”是准确的。
  2. 不能获取元素本身。
  3. 一般情况下不能将元素从布隆过滤器中删除元素。

2.4 布隆过滤器使用场景

场景一:运行容忍布隆过滤器的误判。

例如:在游戏中创建创建昵称,为了保证游戏的昵称是具有唯一性的,并且可以快速判断一个游戏昵称是否被创建过,我们可以将之前定义的所有游戏昵称都映射到布隆过滤器中,然后将要创建的游戏昵称与布隆过滤器进行对比,如果存在,此时之前不一定能够创建过,但是我们不能够创建该昵称,如果不存在,那么该昵称之前一定没有创建过,所以就可以创建它,这样就保证了每个角色的游戏昵称的唯一性。
 

场景二:判断一个手机号是否注册过游戏账号

我们可以将所有创建过账号的手机号放在数据库中,然后将数据库中的映射到一个布隆过滤器中,

我们可以先去布隆过滤器中判断该手机号是否被注册过,如果没有被注册过账号,那么该手机号一定没有被注册过,如果判断是注册过,则该手机不一定被注册过,那么在到数据库中进行判断是否被创建过账号。因为大部分手机号要注册游戏账号都是没有被注册过的,可以排除大部分去数据库中查找的情况。

问题五

1. 给两个文件,文件1和文件2,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法。

query:可能是http网络请求,sql请求,本质都是字符串

近视算法:位图映射

在内存中创建一个1gb的布隆过滤器,然后将文件1中所有的query都映射到布隆过滤器中,然后文件2通过该布隆过滤器去判断是否query是否在布隆过滤器中,如果在布隆过滤器中,那么该query就是交集。

精确算法:哈希切分

假设平均一个query为20个字节,那么一个文件的大小就大约为200G,所以我们可以将一个文件分成为400个小文件,a0,a1,a2,...a399,平均每个文件为500mb,然后对文件1中的query进行BKDRHash()(querty)%400计算,将计算的结果放在对应的小文件中,如果结果为querty计算的结果为32,那么放在a32文件中,同样文件2也分成400个小文件,b0,b1,b2....b399,然后对文件2中的query进行BKDRHash()(querty)%400计算,将计算结果放进相对应的小文件中。因为文件1和文件2使用的相同的哈希函数,所以两个文件相同的query会放在下标一致的文件中,然后求出a0和b0,a1和b1...a399和b399的交集即可。可以先将一个文件加载内存中,利用under_set建立映射,另一个文件在通过映射关系求出交集。

问题六

如何扩展BloomFilter使得它支持删除元素的操作?

采用计数的方式标记每个位置,之前的布隆过滤器是一个映射位置是1个bit位,所以只能表示0和1,那么我们可以8个bit(一个字节)位标记一个映射位置,所以一个映射位置可以表示0~255。所以当有一个字符串映射到某个位置上时,那么该位置就+1,如果删掉某个字符串时,那么该字符串映射的对应的位置就-1。

 

 删除田六,将15和20,25上的位置都减1。

 问题七

 给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?

解决方法:哈希切分

创建1000个小文件,小文件a0,a1,a2...,a999,每个文件大小大约是100mb(每个文件的大小不一定是一样),然后对所有的IP地址利用哈希函数转换为整数,将转换的整数%1000,如:结果=BKDRHash(x)%1000,得到的结果就放在相对应的文件中,结果是1,那么放在小文件a1中,因为是所有的IP地址使用的是相同的哈希函数,那么相同的IP转换成整数是一定相同的,则相同的IP地址一定放在同一小文件中,然后再将一个一个的小文件加载到内存中,统计IP地址的次数,可以使用map进行统计,最后将每个文件中出现最多次数的IP和次数放在一个文件中,最后在将这个文件加载内存中进行对比,通过排序,就可以找到log flie文件中出现最多次数的IP。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【c++】——海量数据处理各种面试题(位图的实现和应用,布隆过滤器的应用,哈希切分) 的相关文章

  • 具有相同参数类型但具有不同常量限定符的 std::vector 的转换

    问题很简单 静态转换 或其他一些转换 通常是安全的 std vector lt Foo gt to std vector lt const Foo gt 就二进制而言 我不明白为什么本机类型会有所不同 毕竟const是一种语言约束 不应影响
  • X11 模式对话框

    如何使用 Xlib 在 X11 中创建模式对话框 模态对话框是一个位于应用程序其他窗口之上的窗口 就像瞬态窗口一样 并且拒绝将焦点给予应用程序的其他窗口 在 Windows 中 当试图从模态窗口夺取焦点时 模态也会通过闪 烁模态窗口的标题栏
  • 为什么我会收到未找到分析器的警告?

    我创建了一个玩具项目来检查最新的 NET 7 预览版 5 和正则表达式代码生成 它效果很好 所以我对现有项目应用了相同的更改 不是为了生产 而是为了个人生产力 由于某种原因 我收到这些警告 CS8032 An instance of ana
  • 将公历日期转换为儒略日期,然后再转换回来(随着时间)

    我正在编写一个程序 必须将当前的公历日期和时间转换为儒略日期 然后再转换回公历门 最终我需要添加能够添加年 月 日 小时 分钟和秒的功能 但我需要先解决这部分问题 现在我已经从公历日期转换为儒略日期 所以从逻辑上讲 我觉得我应该能够以某种方
  • 平滑手绘曲线

    我有一个允许用户绘制曲线的程序 但这些曲线看起来不太好 它们看起来摇摇欲坠 而且是手绘的 所以我想要一种能够自动平滑它们的算法 我知道平滑过程中存在固有的模糊性 因此它不会每次都完美 但这种算法似乎确实存在于多个绘图包中 并且它们工作得很好
  • ASP.NET - 在 RenderContent 调用中将事件处理程序添加到 Repeater 内的 LinkBut​​ton

    我有一个加载自定义用户控件的 Sharepoint WebPart 用户控件包含一个 Repeater 而 Repeater 又包含多个 LinkBut ton 在 Web 部件的 RenderContent 调用中 我有一些用于添加事件处
  • 组合框下拉位置

    我有一个最大化的表单 其中包含 500px 的组合框控件 停靠在右上角 Width 尝试打开组合框后 列表的一半超出了屏幕 如何强制列表显示在表单中 棘手的问题 我找不到解决这个问题的好办法 只是一个解决方法 添加一个新类并粘贴如下所示的代
  • Linq 合并列表

    我的课 public class Foo public int A get set public List
  • Visual Studio 中列表框的上移、下移按钮[重复]

    这个问题在这里已经有答案了 我正在尝试制作一个上移按钮和一个下移按钮 以移动 Microsoft Visual Studio 2012 中列表框中的选定项目 我已经在 WDF jquery winforms 和其他一些表单中看到了其他示例
  • 控制台应用程序中使用 Unicode 字符的 _tprintf

    我正在从 Unicode 构建的控制台应用程序 使用 C 和 Visual Studio 2008 执行这个简单的输出 此代码旨在在 Windows 上运行 tprintf L Some sample string n 一切正常 但是如果我
  • 在c#中获取没有时间的日期

    我的表上有一列 缺勤日期时间 日期 当我想要获取包含日期的行时 它返回 0 行 这是我的 C 代码 DateTime ClassDate DateTime Parse lblDate Content ToString var Abs dbs
  • 处理“未找到细胞”。 Excel 中的错误

    我正在使用 Excel VSTO 应用程序并使用以下代码在工作表中查找错误单元格 Excel Range rngTemp Excel Range rngErrorRange Excel Worksheet Sheet1 Excel Work
  • 如何从外语线程调用Python函数(C++)

    我正在开发一个程序 使用 DirectShow 来抓取音频数据 媒体文件 DirectShow 使用线程将音频数据传递给回调 我的程序中的函数 然后我让该回调函数调用另一个函数 Python 中的函数 我使用 Boost Python 来包
  • 使用数据绑定,如何将包含表情符号的文本绑定到标签并使其正确显示?

    我正在编写一个应用程序来连接 WordPress BuddyPress API 该应用程序将允许用户通过 API 相互发送消息 当这些消息包含表情符号时 我很难正确显示它们 以下是 API 返回的消息文本的简短示例 Hi x1f642 ho
  • C#:自定义转换为值类型

    是否可以将自定义类转换为值类型 这是一个例子 var x new Foo var y int x Does not compile 是否有可能实现上述情况 我需要超载一些东西吗Foo 您将必须重载强制转换运算符 public class F
  • DataGridView 行背景颜色没有改变

    我想根据加载时的特定条件更改 DGV 行的背景颜色 即使在 Windows 窗体中也是如此 但我看不到任何 DGV 行的颜色有任何变化 谁能告诉我如何解决这个问题 private void frmSecondaryPumps Load ob
  • valgrind 在 Raspberry Pi 上返回未处理的指令

    我最近一直在尝试在运行 Debian GNU Linux7 0 喘息 的树莓派 型号 b 上使用 valgrind 来调试分段错误 每次我在编译的 C 程序上运行 valgrind 时 都会得到类似以下内容的信息 disInstr arm
  • Gremlin.net 文本包含等效项

    我正在使用 Gremlin net 库连接到 janus 图形服务器 我使用 cassandra 和弹性搜索进行数据存储和索引 在我使用的 gremlin 语言和 gremlin 控制台中文本包含在属性的文本中进行搜索 我正在使用混合索引
  • C++ 中是否有与 PHP 的explode() 函数等效的函数? [复制]

    这个问题在这里已经有答案了 可能的重复 在 C 中分割字符串 https stackoverflow com questions 236129 splitting a string in c 在 PHP 中 explode 函数将获取一个字
  • 连接到没有元数据的网络服务

    我想连接到此网络服务 https training api temando com schema 2009 06 server wsdl https training api temando com schema 2009 06 serve

随机推荐

  • 为什么 Linux 没有注册表?

    目录 linux无注册表机制的优势 为什么 Linux 没有注册表 linux无注册表机制的优势 linux系统有注册表吗 鸿网互联 本教程操作环境 linux7 3系统 Dell G3电脑 linux系统没有注册表 注册表 Registr
  • MySql 插入(insert)性能测试 以及优化

    http blog csdn net lgh1117 article details 8619486 测试环境 笔记本电脑 CPU I5 系统 MAC OS 10 7 内存 8G 硬盘 5400转 笔记本硬盘 MySql 版本 Oracle
  • ChatGLM(国内版的chatGPT)

    Git链接 GitHub THUDM ChatGLM 6B ChatGLM 6B 开源双语对话语言模型 An Open Bilingual Dialogue Language Model 介绍 ChatGLM 6B 是一个开源的 支持中英双
  • Unity UI拖拽模型选择

    指定一块区域 玩家鼠标or手指拖拽这个区域 模型会进行偏移 并用于进行人物 道具的选择 给模型定义一些属性 using System Collections using System Collections Generic using Un
  • BaGet搭建Nuget私仓(window10&docker)

    文章目录 一 搭建背景 二 框架简介 三 私仓搭建 1 环境 2 win10上部署 2 1安装SDK 2 2下载和解压BaGet包 2 3运行项目 2 4类库项目 2 5将包发布到私有Nuget中 2 6使用BaGetFirstLib 2
  • React中使用Hooks - useImperativeHandle

    useImperativeHandle useImperativeHandle ref createHandle dependencies 可以使用 useImperativeHandle 来暴露一些特定的操作 在子组件中使用useImpe
  • 随机森林和梯度提升回归树(笔记)

    最近在自学图灵教材 Python机器学习基础教程 在csdn以博客的形式做些笔记 决策树集成 集成 ensemble 是合并多个机器学习模型来构建更强大模型的方法 在机器学习文献中有许多模型都属于这一类 但已证明有两种集成模型对大量分类和回
  • com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@解决方案

    在配置c3p0通过配置文件创建数据源对象时 报错信息如题 原因一 你的数据库各类信息是否正确 url username password是否正确 原因二 是否将必需的jar包都放进工程中 原因三 你导入的mysql的jar包和你设置的驱动信
  • chrome浏览器如何查看、修改、删除Cookie

    1 chrome浏览器的cookie保存位置 C Users 你的用户名 AppData Local Google Chrome User Data Default 快捷键win r 运行以上路径可以打开该目录 Cookies文件存储的就是
  • centos手动增加删除swap分区

    SWAP是Linux中的虚拟内存 用于扩充物理内存不足而用来存储临时数据存在的 它类似于Windows中的虚拟内存 在Windows中 只可以使用文件来当作虚拟内存 而linux可以文件或者分区来当作虚拟内存 首先查看当前的内存和swap
  • shell浅谈之八I/O重定向

    一 简介 I O重定向用于捕获一个文件 命令 程序或脚本甚至代码块的输出 然后把捕获到的输出作为输入发送给另外一个文件 命令 程序或脚本等 I O重定向最常用的方法是管道 管道符 二 详解 1 管道 1 管道技术是Linux间的一种通信技术
  • Spring框架概述 --- 控制反转, 依赖注入, 容器和Bean

    Spring框架概述 控制反转 依赖注入 容器和Bean Spring框架的好处 控制反转 Spring IOC容器和Bean 依赖注入 控制反转的实现方法 Spring中bean的装配 定义bean并描述bean之间的依赖关系 Sprin
  • 哈工大2020春软件构造期末试题

  • 机器视觉 解决方案

    1 光源选型 光源作用及选型方法 照明作用 1 使需要被观察的特征与需要被忽略的特征之间产生的最大的对此度 从而易于特征的区分 2 排除周围环境光的干扰 光源的颜色 如果需要打成白色 那么就得使用与此颜色相同或相似的光源 光的波长一样活接近
  • C#运行程序无法启动,因为应用程序的并行配置不正确【解决方案】

    最近编写个C 控制台应用程序 调试正常之后 通过U盘copy到产线电脑 结果运行报错如下 1 通过代码调试发现无任何效果 说面不是代码引起的异常也捕获不到这个系统错误 2 重新生成程序 将整个Debug项目文件放置到产线电脑 可以正常运行
  • git记录python代码

    准备阶段 cd path 进入要创建文件夹的路径 mkdir name 创建文件夹 建立工作区 pwm 查看所在文件价路径名 git init 文件夹初始化 此后可以记录文档变化 进行阶段 git add FileName 后缀 将file
  • centos7安装libreoffice

    下载地址 https www libreoffice org download download type rpm x86 64 version 6 1 4 lang zh CN 1 将下载的文件拷贝到安装的目录 mv LibreOffic
  • SpringBoot介绍及环境搭建

    什么是SpringBoot Spring Boot是由Pivotal团队提供的全新框架 其设计目的是用来简化新Spring应用的初始搭建以及开发过程 该框架使用了特定的方式来进行配置 从而使开发人员不再需要定义样板化的配置 SpringBo
  • ImportError: cannot import name ‘render_to_response‘ 解决方法

    背景 在开发 Django 项目 的时候 原来的版本是1 xx版本 现在直接用 diango3 0 出现的问题 在直接运行爆出错误 ImportError cannot import name render to response from
  • 【c++】——海量数据处理各种面试题(位图的实现和应用,布隆过滤器的应用,哈希切分)

    目录 一 位图 1 1 位图的概念 1 2 位图的使用场景 题目一 题目二 题目三 题目四 二 布隆过滤器 2 1 布隆过滤器的概念 2 2 布隆过滤器优点 2 3 布隆过滤器缺点 2 4 布隆过滤器使用场景 问题五 问题六 问题七 一 位