前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【C++】AVL树

【C++】AVL树

作者头像
风中的云彩
发布于 2025-05-06 05:22:34
发布于 2025-05-06 05:22:34
7601
代码可运行
举报
文章被收录于专栏:C/C++的自学之路C/C++的自学之路
运行总次数:1
代码可运行

AVL树的概念

1. AVL树是一种 自平衡二叉搜索树,具有以下性质:

  • 空树性质一棵AVL树可以是空树
  • 递归性质:如果非空,则AVL树满足以下条件:
    1. 左右子树均为AVL树
    2. 左右子树的高度差(即平衡因子)的绝对值不超过1

2. AVL树需要引入一个平衡因子的概念,每个结点都有一个平衡因子,任何结点的平衡因子等于右子树的高度减去左子树的高度,也就是说任何结点的平衡因子等于01-1。 3. AVL树整体结点数量和分布与完全二叉树类似,高度可以控制在log(N),那么增删查改的效率也可以控制在log(N),相比二叉搜索树有了本质的提升。

AVL树的插入

整体的插入规则

1. 先按 二叉搜索树规则 进行插入。 2. 新增结点只会影响祖先结点的高度 ,也就是可能会影响部分祖先结点的平衡因子。所以 需要更新从新增结点到根结点路径上的平衡因子 ,实际中最坏情况下要更新到根,有些情况更新到中间就可以停止了。 3. 更新平衡因子过程中没有出现问题,则插入结束。 4. 更新平衡因子过程中出现不平衡对不平衡子树旋转 。旋转后,本质调平衡的同时,本质降低了子树的高度,不会再影响上一层,所以插入结束。

平衡因子更新原则

1. 平衡因子 = 右子树高度 - 左子树高度 。 2. 只有 子树高度变化 才会影响当前结点的平衡因子。 3. 插入结点会增加高度 。当新增结点在 parent的右子树parent的平衡因子++ ;当新增结点在 parent的左子树parent平衡因子--

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bool insert(const K& x, const V& y)
{
	Node* cur = _root;
	Node* parent = nullptr;
	if (_root == nullptr)
	{
		_root = new Node(x, y);
		return true;
	}
	else
	{
		while (cur != nullptr)
		{
			if (cur->_key < x)
			{
				parent = cur;
				cur = cur->_right;
			}
			else if (cur->_key > x)
			{
				parent = cur;
				cur = cur->_left;
			}
			else
			{
				return false;//不允许有重复
			}
		}
	}
	cur = new Node(x, y);
	if (parent->_key < cur->_key)
	{
		parent->_right = cur;
	}
	else
	{
		parent->_left = cur;
	}
	cur->_parent = parent;
	//更新平衡因子
	while (parent)
	{
		if (cur == parent->left)
		{
			parent->bf--;
		}
		else if (cur == parent->right)
		{
			parent->bf++;
		}
		if (parent->_bf == 0)
		{
			break;
		}
		else if (parent->_bf == 1 || parent->_bf == -1)
		{
			cur = parent;
			parent = parent->_parent;
		}
		else if (parent->_bf == 2 || parent->_bf == -2)
		{
			//需要进行旋转调整
            ...
		}
		else
		{
			assert(false);
		}
	}
	return true;
}

旋转原则

1. 保持二叉搜索树性质的前提下让旋转的树从不平衡变平衡。 3. 旋转总共分为四种, 左单旋右单旋左右双旋右左双旋

右单旋
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void Rotate_Right(Node* parent)
{
	Node* ppNode = parent->_parent;
	Node* sub_left = parent->_left;
	Node* subl_right = sub_left->_right;

	sub_left->_right=parent;
	parent->_parent = sub_left;
	parent->_left = subl_right;
	if (subl_right)
	{
		subl_right->_parent = parent;
	}
	if (ppNode==nullptr)
	{
		_root = sub_left;
		sub_left->_parent = nullptr;
	}
	else
	{
		if (ppNode->_left == parent)
		{
			ppNode->_left = sub_left;
		}
		else
		{
			ppNode->_right = sub_left;
		}
	}
}
左单旋
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void Rotate_Left(Node* parent)
{
	Node* ppNode = parent->_parent;
	Node* sub_right = parent->_right;
	Node* subr_left = sub_right->_left;

	sub_right->_left = parent;
	parent->_parent = sub_right;
	parent->_right = subr_left;
	if (subr_left)
	{
		subr_left->_parent = parent;
	}
	if (ppNode == nullptr)
	{
		_root = sub_right;
		sub_right->_parent = nullptr;
	}
	else
	{
		if (ppNode->_left == parent)
		{
			ppNode->_left = sub_right;
		}
		else
		{
			ppNode->_right = sub_right;
		}
	}
}
左右双旋
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void Rotate_Left_Right(Node* parent)
{
	Node* sub_left = parent->_left;
	Node* subl_right = sub_left->_right;
	int bf=subl_right->_bf;

	Rotate_Left(sub_left);
	Rotate_Right(parent);

	if (bf == 0)
	{
		parent->_bf = 0;
		sub_left->_bf = 0;
		subl_right->_bf = 0;
	}
	else if (bf == 1)
	{
		parent->_bf = 0;
		sub_left->_bf = -1;
		subl_right->_bf = 0;
	}
	else if (bf == -1)
	{
		parent->_bf = 1;
		sub_left->_bf = 0;
		subl_right->_bf = 0;
	}
	else
	{
		assert(false);
	}
}
右左双旋
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void Rotate_Right_Left(Node* parent)
{
	Node* sub_right = parent->_right;
	Node* subr_left = sub_right->_left;
	int bf = subr_left->_bf;

	Rotate_Right(sub_right);
	Rotate_Left(parent);

	if (bf == 0)
	{
		parent->_bf = 0;
		sub_right->_bf = 0;
		subr_left->_bf = 0;
	}
	else if (bf == 1)
	{
		parent->_bf = -1;
		sub_right->_bf = 0;
		subr_left->_bf = 0;
	}
	else if (bf == -1)
	{
		parent->_bf = 0;
		sub_right->_bf = 1;
		subr_left->_bf = 0;
	}
	else
	{
		assert(false);
	}
}

插入的整体代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bool insert(const K& x, const V& y)
{
	Node* cur = _root;
	Node* parent = nullptr;
	if (_root == nullptr)
	{
		_root = new Node(x, y);
		return true;
	}
	else
	{
		while (cur != nullptr)
		{
			if (cur->_key < x)
			{
				parent = cur;
				cur = cur->_right;
			}
			else if (cur->_key > x)
			{
				parent = cur;
				cur = cur->_left;
			}
			else
			{
				return false;//不允许有重复
			}
		}
	}
	cur = new Node(x, y);
	if (parent->_key < cur->_key)
	{
		parent->_right = cur;
	}
	else
	{
		parent->_left = cur;
	}
	cur->_parent = parent;
	//更新平衡因子
	while (parent)
	{
		if (cur == parent->_left)
		{
			parent->_bf--;
		}
		else if (cur == parent->_right)
		{
			parent->_bf++;
		}
		if (parent->_bf == 0)
		{
			break;
		}
		else if (parent->_bf == 1 || parent->_bf == -1)
		{
			cur = parent;
			parent = parent->_parent;
		}
		else if (parent->_bf == 2 || parent->_bf == -2)
		{
			//开始旋转
			if (parent->_bf == -2 && parent->_left->_bf == -1)
			{
				Rotate_Right(parent);
				break;
			}
			else if (parent->_bf == 2 && parent->_right->_bf == 1)
			{
				Rotate_Left(parent);
				break;
			}
			else if (parent->_bf == -2 && parent->_left->_bf == 1)
			{
				Rotate_Left_Right(parent);
				break;
			}
			else if (parent->_bf == 2 && parent->_right->_bf == -1)
			{
				Rotate_Right_Left(parent);
				break;
			}
			else
			{
				assert(false);
			}
		}
		else
		{
			assert(false);
		}
	}
	return true;
}
void Rotate_Right(Node* parent)
{
	Node* ppNode = parent->_parent;
	Node* sub_left = parent->_left;
	Node* subl_right = sub_left->_right;

	sub_left->_right=parent;
	parent->_parent = sub_left;
	parent->_left = subl_right;
	if (subl_right)
	{
		subl_right->_parent = parent;
	}
	if (ppNode==nullptr)
	{
		_root = sub_left;
		sub_left->_parent = nullptr;
	}
	else
	{
		if (ppNode->_left == parent)
		{
			ppNode->_left = sub_left;
		}
		else
		{
			ppNode->_right = sub_left;
		}
	}
}
void Rotate_Left(Node* parent)
{
	Node* ppNode = parent->_parent;
	Node* sub_right = parent->_right;
	Node* subr_left = sub_right->_left;

	sub_right->_left = parent;
	parent->_parent = sub_right;
	parent->_right = subr_left;
	if (subr_left)
	{
		subr_left->_parent = parent;
	}
	if (ppNode == nullptr)
	{
		_root = sub_right;
		sub_right->_parent = nullptr;
	}
	else
	{
		if (ppNode->_left == parent)
		{
			ppNode->_left = sub_right;
		}
		else
		{
			ppNode->_right = sub_right;
		}
	}
}
void Rotate_Left_Right(Node* parent)
{
	Node* sub_left = parent->_left;
	Node* subl_right = sub_left->_right;
	int bf=subl_right->_bf;

	Rotate_Left(sub_left);
	Rotate_Right(parent);

	if (bf == 0)
	{
		parent->_bf = 0;
		sub_left->_bf = 0;
		subl_right->_bf = 0;
	}
	else if (bf == 1)
	{
		parent->_bf = 0;
		sub_left->_bf = -1;
		subl_right->_bf = 0;
	}
	else if (bf == -1)
	{
		parent->_bf = 1;
		sub_left->_bf = 0;
		subl_right->_bf = 0;
	}
	else
	{
		assert(false);
	}
}
void Rotate_Right_Left(Node* parent)
{
	Node* sub_right = parent->_right;
	Node* subr_left = sub_right->_left;
	int bf = subr_left->_bf;

	Rotate_Right(sub_right);
	Rotate_Left(parent);

	if (bf == 0)
	{
		parent->_bf = 0;
		sub_right->_bf = 0;
		subr_left->_bf = 0;
	}
	else if (bf == 1)
	{
		parent->_bf = -1;
		sub_right->_bf = 0;
		subr_left->_bf = 0;
	}
	else if (bf == -1)
	{
		parent->_bf = 0;
		sub_right->_bf = 1;
		subr_left->_bf = 0;
	}
	else
	{
		assert(false);
	}
}

AVL树的遍历

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public:
    void InOrder()
    {
	    _InOrder(_root);
    }

private:
    void _InOrder(Node* root)
    {
	    if (root == nullptr)
	    {
		    return;
	    }
	    else
	    {
		    _InOrder(root->_left);
		    cout << root->_key << " " << root->_val << endl;
		    _InOrder(root->_right);
	    }
    }

AVL树的检验

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public:
    bool IsAVLTree(Node* root)
    {
	    if (root == nullptr)
	    {
		    return true;
	    }
	    int left_height = _Height(root->_left);
	    int right_height = _Height(root->_right);
	    int diff = right_height - left_height;
	    if (abs(diff) >= 2)
	    {
		    cout << "高度差异常" << " " << root->_key;
		    return false;
	    }
	    if (diff != root->_bf)
	    {
		    cout << "平衡因子异常" << " " << root->_key;
		    return false;
	    }
	    return IsAVLTree(root->_left) && IsAVLTree(root->_right);//从中间节点向左右两边递归
    }
private:
    int _Height(Node* root)
    {
	    if (root == nullptr)
	    {
	    	return 0;
	    }
	    int left_Height = _Height(root->_left);
	    int right_Height = _Height(root->_right);
	    return left_Height > right_Height ? left_Height + 1 : right_Height + 1;
    }

AVL树整体代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cassert>
using namespace std;

template <class K,class V>
struct AVLTNode
{
	typedef AVLTNode<K, V> Node;

	K _key;
	V _val;
	Node* _left;
	Node* _right;
	Node* _parent;
	int _bf; 

	AVLTNode(const K& key,const V& val)
		: _key(key)
		, _val(val)
		, _left(nullptr)
		, _right(nullptr)
		, _parent(nullptr)
		, _bf(0)
	{}
};

template<class K, class V>
class AVLTree
{
	typedef AVLTNode<K, V> Node;
	typedef AVLTree<K, V> Tree;

public:

	AVLTree()
		:_root(nullptr)
	{}

	bool insert(const K& x, const V& y)
	{
		Node* cur = _root;
		Node* parent = nullptr;
		if (_root == nullptr)
		{
			_root = new Node(x,y);
			return true;
		}
		else
		{
			while (cur != nullptr)
			{
				if (cur->_key < x)
				{
					parent = cur;
					cur = cur->_right;
				}
				else if (cur->_key > x)
				{
					parent = cur;
					cur = cur->_left;
				}
				else
				{
					return false;//不允许有重复
				}
			}
		}
		cur = new Node(x, y);
		if (parent->_key < cur->_key)
		{
			parent->_right = cur;
		}
		else
		{
			parent->_left = cur;
		}
		cur->_parent = parent;
		//更新平衡因子
		while (parent)
		{
			if (cur == parent->_left)
			{
				parent->_bf--;
			}
			else if (cur == parent->_right)
			{
				parent->_bf++;
			}
			if (parent->_bf == 0)
			{
				break;
			}
			else if (parent->_bf == 1 || parent->_bf == -1)
			{
				cur = parent;
				parent = parent->_parent;
			}
			else if (parent->_bf == 2 || parent->_bf == -2)
			{
				//开始旋转
				if (parent->_bf == -2 && parent->_left->_bf == -1)
				{
					Rotate_Right(parent);
					break;
				}
				else if (parent->_bf == 2 && parent->_right->_bf == 1)
				{
					Rotate_Left(parent);
					break;
				}
				else if (parent->_bf == -2 && parent->_left->_bf == 1)
				{
					Rotate_Left_Right(parent);
					break;
				}
				else if (parent->_bf == 2 && parent->_right->_bf == -1)
				{
					Rotate_Right_Left(parent);
					break;
				}
				else
				{
					assert(false);
				}
			}
			else
			{
				assert(false);
			}
		}
		return true;
	}

	Node* Find(const K& x)
	{
		Node* cur = _root;
		while (cur != nullptr)
		{
			if (cur->_key < x)
			{
				cur = cur->_right;
			}
			else if (cur->_key > x)
			{
				cur = cur->_left;
			}
			else
			{
				return cur;
			}
		}
		return nullptr;
	}

	void InOrder()
	{
		_InOrder(_root);
	}

	bool IsAVLTree(Node* root)
	{
		if (root == nullptr)
		{
			return true;
		}
		int left_height = _Height(root->_left);
		int right_height = _Height(root->_right);
		int diff = right_height - left_height;
		if (abs(diff) >= 2)
		{
			cout << "高度差异常" << " " << root->_key;
			return false;
		}
		if (diff != root->_bf)
		{
			cout << "平衡因子异常" << " " << root->_key;
			return false;
		}
		return IsAVLTree(root->_left) && IsAVLTree(root->_right);//从中间节点向左右两边递归
	}
	
private:

	void _InOrder(Node* root)
	{
		if (root == nullptr)
		{
			return;
		}
		else
		{
			_InOrder(root->_left);
			cout << root->_key << " " << root->_val << endl;
			_InOrder(root->_right);
		}
	}

	void Rotate_Right(Node* parent)
	{
		Node* ppNode = parent->_parent;
		Node* sub_left = parent->_left;
		Node* subl_right = sub_left->_right;

		sub_left->_right = parent;
		parent->_parent = sub_left;
		parent->_left = subl_right;
		if (subl_right)
		{
			subl_right->_parent = parent;
		}
		if (ppNode == nullptr)
		{
			_root = sub_left;
			sub_left->_parent = nullptr;
		}
		else
		{
			if (ppNode->_left == parent)
			{
				ppNode->_left = sub_left;
			}
			else
			{
				ppNode->_right = sub_left;
			}
		}
	}

	void Rotate_Left(Node* parent)
	{
		Node* ppNode = parent->_parent;
		Node* sub_right = parent->_right;
		Node* subr_left = sub_right->_left;

		sub_right->_left = parent;
		parent->_parent = sub_right;
		parent->_right = subr_left;
		if (subr_left)
		{
			subr_left->_parent = parent;
		}
		if (ppNode == nullptr)
		{
			_root = sub_right;
			sub_right->_parent = nullptr;
		}
		else
		{
			if (ppNode->_left == parent)
			{
				ppNode->_left = sub_right;
			}
			else
			{
				ppNode->_right = sub_right;
			}
		}
	}

	void Rotate_Left_Right(Node* parent)
	{
		Node* sub_left = parent->_left;
		Node* subl_right = sub_left->_right;
		int bf = subl_right->_bf;

		Rotate_Left(sub_left);
		Rotate_Right(parent);

		if (bf == 0)
		{
			parent->_bf = 0;
			sub_left->_bf = 0;
			subl_right->_bf = 0;
		}
		else if (bf == 1)
		{
			parent->_bf = 0;
			sub_left->_bf = -1;
			subl_right->_bf = 0;
		}
		else if (bf == -1)
		{
			parent->_bf = 1;
			sub_left->_bf = 0;
			subl_right->_bf = 0;
		}
		else
		{
			assert(false);
		}
	}

	void Rotate_Right_Left(Node* parent)
	{
		Node* sub_right = parent->_right;
		Node* subr_left = sub_right->_left;
		int bf = subr_left->_bf;

		Rotate_Right(sub_right);
		Rotate_Left(parent);

		if (bf == 0)
		{
			parent->_bf = 0;
			sub_right->_bf = 0;
			subr_left->_bf = 0;
		}
		else if (bf == 1)
		{
			parent->_bf = -1;
			sub_right->_bf = 0;
			subr_left->_bf = 0;
		}
		else if (bf == -1)
		{
			parent->_bf = 0;
			sub_right->_bf = 1;
			subr_left->_bf = 0;
		}
		else
		{
			assert(false);
		}
	}

	int _Height(Node* root)
	{
		if (root == nullptr)
		{
			return 0;
		}
		int left_Height = _Height(root->_left);
		int right_Height = _Height(root->_right);
		return left_Height > right_Height ? left_Height + 1 : right_Height + 1;//子树的高度等于左右子树高度的最大值加1。
	}

	Node* _root;
};
int main()
{
	AVLTree<int, string> a1;
	a1.insert(1, "苹果");
	a1.insert(2, "西瓜");
	a1.insert(3, "菠萝");
	a1.insert(8, "车厘子");
	a1.insert(4, "樱桃");
	a1.insert(5, "梨子");
	a1.insert(6, "香蕉");
	a1.insert(7, "哈密瓜");
	a1.InOrder();
	auto it = a1.Find(5);
	if (a1.Find(5))
	{
		cout << it->_key << "->" << it->_val;
	}
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
专访INDEMIND:机器人视觉导航将成行业主流
近年来,机器人已经从最初的工业应用逐步且广泛的进入人们的日常生活中,银行、酒店、医院、商场的服务机器人已经为人所熟悉,18年的无人餐厅更是博得了大量眼球,随着应用场景的扩充,也有类似撞人、错位、运行不稳定等问题频频出现。面对这些问题,视觉导航的机器人应用被提上日程,各大调研机构也纷纷给出视觉导航将是机器人未来重要发展方向。
INDEMIND
2019/03/26
9370
专访INDEMIND:机器人视觉导航将成行业主流
软硬件一体化渐成趋势,视觉产业市场的“新蓝海”在哪里?
智能时代,“计算机视觉+普通相机”已经不能满足需求,作为“硬件主体”的相机是时候升级了。
镁客网
2019/09/17
7630
软硬件一体化渐成趋势,视觉产业市场的“新蓝海”在哪里?
科沃斯开启家用服务机器人行业3.0时代:用“技术”撬动增长飞轮
今年扫地机器人赛道延续了自去年以来的火热,AVC数据显示,2021年上半年,扫地机器人零售规模为53亿元,同比增长39%。零售量280万台,同比增长了2%。
用户2908108
2021/10/08
3290
听说,3D ToF传感器将成研发主流!
“懒人改变世界”,创新发明可以解放人类的双手,让我们专注在更多自己热衷的事情上。如果挑选一样为咱们解放双手的智能家居产品,小编绝对会投“扫地机器人”一票,只需出门前启动机器,下班到家就已经打扫得干干净净,让你瞬间纾解一天的疲倦!
小白学视觉
2022/12/27
4290
听说,3D ToF传感器将成研发主流!
奥比中光:进击具身智能,打造机器人之眼
在5月的ITF世界半导体大会上,英伟达创世人兼CEO黄仁勋说,人工智能的下一波浪潮将是具身智能。
数据猿
2023/09/15
3170
奥比中光:进击具身智能,打造机器人之眼
机器视觉公司速感科技完成千万美元B轮融资,或为下一个视觉行业独角兽
【新智元导读】专注于计算机视觉的AI领跑企业速感科技正式宣布完成千万美元B轮融资。至此,速感科技成立至今3年已累计完成4轮次12家国内外一线投资机构超过1亿元人民币投资。 专注于计算机视觉的AI领跑企业速感科技正式宣布完成千万美元B轮融资,本轮融资由启迪科技服务集团人保基金及中芯国际聚源资本联合领投,原有股东WI Harper Group(美国中经合集团)、赛富亚洲基金、飞图创投、启迪之星继续跟投。至此,速感科技成立至今3年已累计完成4轮次12家国内外一线投资机构超过1亿元人民币投资。创始人兼CEO陈震提到
新智元
2018/03/21
8530
机器视觉公司速感科技完成千万美元B轮融资,或为下一个视觉行业独角兽
触景无限CEO肖洪波:为机器“点睛”,催生人工智能“奇点”的到来丨科技云·专访
2016年,人类终于迎来了人工智能史上一个重要奇点时刻的到来——AlphaGo以4∶1的成绩战胜世界围棋冠军李世石。被业界公认为下一代技术革命引爆点的人工智能,在迅速向市场化、产业化的发展方向上,为世界带来了巨大的想象空间。
科技云报道
2022/04/14
5560
触景无限CEO肖洪波:为机器“点睛”,催生人工智能“奇点”的到来丨科技云·专访
速感科技陈震:以机器视觉为核心,让低成本、高性价比成为机器人行业关键词 | 镁客请讲
未来五年时间内,小型化、模块化、前端化将成为该技术主要的发展趋势。 “低成本、高性价比是我们的vSLAM最大的特性。”速感科技创始人&CEO陈震说。 图 | 速感科技创始人&CEO陈震 90后创业者 用技术眼光看未来 陈震是个90后。93年,金牛座,一个年轻的创业者。 2011年,陈震考上了北航计算机专业,并在大学的第二年,进入到了北航实验室,开始帮助老师做一些专题课题申请方面的工作。这其中,还包含如国家级特种机器人、特种无人机等的军工课题。也是在这期间,他积累了大量有关于视觉算法研发方面的经验。 201
镁客网
2018/05/29
7810
CES2015快报:前所未见的新奇机器人应有尽有
作为全球最大、影响最为广泛的消费类电子产品展,CES一向是电子行业的风向标,各大厂商都会使尽浑身解数对外展出各种全新的技术和产品,同时也会吸引众多的专业观众前往观展,包括行业的供应商、采购商以及相关技
机器人网
2018/04/13
9590
CES2015快报:前所未见的新奇机器人应有尽有
机器人步入3.0时代:科沃斯靠什么继续称霸扫地机江湖?
去年科沃斯举办的一场新品发布会上,科沃斯机器人CEO宣布“科沃斯开启了家用服务机器人的 3.0 时代”,即机器人在功能性、智能性、交互性三方面进行了升级;今年3月,科沃斯又带来一款重磅新品沁宝Z1空气净化器机器人,除开净化空气外,它还可以做到人机交互、视频管家与对讲功能,完全能满足用户在线撸猫、带娃的需求。
用户2908108
2022/09/03
4390
机器人步入3.0时代:科沃斯靠什么继续称霸扫地机江湖?
镁客请讲 | 小觅智能庞琳勇:“视觉+结构光+惯性导航”组合拳为机器人安上“双眼”
人类通过眼睛来认知周围的环境,同样的,智能硬件也需要一双“眼睛”,以实现定位导航,认知周围环境。
镁客网
2019/11/12
8350
镁客请讲 | 小觅智能庞琳勇:“视觉+结构光+惯性导航”组合拳为机器人安上“双眼”
AI时代,人工智能要将机器人带向何方?
随着第四次工业革命(人工智能)的到来,几乎所有的大公司都在AI领域布局自己的版块。在日常生活中,我们每天都能感受到人工智能带给我们的便利,比如智能手机、智能穿戴、智能机器人、互联网大数据搜索等等。
机器人网
2018/04/24
6200
AI时代,人工智能要将机器人带向何方?
360用无人驾驶技术开发的扫地机器人到底有多牛?
用高大上的无人驾驶技术,来开发平民化的扫地机器人,这是360想出来的主意。360人工智能研究院副院长、自动驾驶团队负责人谭平直言,研发过程就像“杀鸡用了牛刀”。那么用牛刀杀鸡的效果到底如何呢? 谭平认为,无人驾驶汽车与扫地机器人在某种程度上其实是同类产品,都需要高清地图、定位、感知、规划、控制等等,在最新发布的智能扫地机器人上,360使用了10类24个传感器进行清扫室内地图绘制和智能清扫规划,清扫覆盖率达到了93.39%,远超过国外销量第一某品牌的51.44%,清扫重复率也仅为17.60%,虽然比国外销
机器人网
2018/04/19
7680
360用无人驾驶技术开发的扫地机器人到底有多牛?
扫地机器人能有多硬核?好家伙自动驾驶、激光扫描、NLP这些硬科技全上了,科沃斯:技术创新才能打破行业内卷
还能直接通过摄像头扫描,就获得带有深度信息的3D版地图,就像苹果iPad Pro一样:
量子位
2021/09/29
4600
Lnton羚通智能分析算法智能机器人系统
机器人的算法大方向可以分为感知算法与控制算法,感知算法一般是环境感知、路径规划,而控制算法一般分为决策算法、运动控制算法。环境感知算法获取环境各种数据,通常指以机器人的视觉所见的图像识别等,当然还有定位机器人的方位——slam,对于不同的机器人而言所处的环境各有千秋。其实我们常见的扫地机器人就是一种定位机器人(slam算法控制的),扫地机器人的行为决策和控制算法都是极其简单的,当遇到阻挡物时调整运动方位即可,扫地部件一致处于工作状态,当然这也是最原始最简单的。
Lnton羚通科技
2023/08/14
4780
「机器人感知与控制关键技术」最新2023研究综述
智能机器人在服务国家重大需求,引领国民经济发展和保障国防安全中起到重要作用,被誉为“制造业皇冠顶端的明珠”。随着新一轮工业革命的到来,世界主要工业国家都开始加快机器人技术的战略部署。而智能机器人作为智能制造的重要载体,在深入实施制造强国战略,推动制造业的高端化、智能化、绿色化过程中将发挥重要作用。
一点人工一点智能
2023/04/04
3.3K0
「机器人感知与控制关键技术」最新2023研究综述
扫地机器人“眼睛”进化史
假如扫地机器人有眼耳五官,又如果我们要为扫地机器人的五官各自著书立传,“眼睛”的进化史绝对是其中最精彩的一部。
AI科技评论
2020/04/14
8060
扫地机器人“眼睛”进化史
四大势力暗战 3D 视觉
过去一年,当大多数资本由激情回归理性,3D视觉赛道却热度不减,并且这股热潮还在持续蔓延。
AI掘金志
2022/11/08
2780
视觉方案好几种,我为何更看好双目视觉
双目立体视觉是机器视觉的一种重要形式,它是基于视差原理并由多幅图像获取物体三维几何信息的方法。双目立体视觉系统一般由双摄像机从不同角度同时获得被测物的两幅数字图像,或由单摄像机在不同时刻从不同角度获得被测物的两幅数字图像,并基于视差原理恢复出物体的三维几何信息,重建物体三维轮廓及位置。双目立体视觉系统在机器视觉领域有着广泛的应用前景。
计算机视觉
2020/11/11
3.8K0
视觉方案好几种,我为何更看好双目视觉
从刷脸支付到刷掌支付,3D视觉公司的新机会?
不论是在商业场景,如商超、便利店,还是个人线上支付,只需要对准人脸轻轻一扫,便可完成支付行为,极大简化了支付流程。
AI掘金志
2023/08/26
5590
从刷脸支付到刷掌支付,3D视觉公司的新机会?
推荐阅读
专访INDEMIND:机器人视觉导航将成行业主流
9370
软硬件一体化渐成趋势,视觉产业市场的“新蓝海”在哪里?
7630
科沃斯开启家用服务机器人行业3.0时代:用“技术”撬动增长飞轮
3290
听说,3D ToF传感器将成研发主流!
4290
奥比中光:进击具身智能,打造机器人之眼
3170
机器视觉公司速感科技完成千万美元B轮融资,或为下一个视觉行业独角兽
8530
触景无限CEO肖洪波:为机器“点睛”,催生人工智能“奇点”的到来丨科技云·专访
5560
速感科技陈震:以机器视觉为核心,让低成本、高性价比成为机器人行业关键词 | 镁客请讲
7810
CES2015快报:前所未见的新奇机器人应有尽有
9590
机器人步入3.0时代:科沃斯靠什么继续称霸扫地机江湖?
4390
镁客请讲 | 小觅智能庞琳勇:“视觉+结构光+惯性导航”组合拳为机器人安上“双眼”
8350
AI时代,人工智能要将机器人带向何方?
6200
360用无人驾驶技术开发的扫地机器人到底有多牛?
7680
扫地机器人能有多硬核?好家伙自动驾驶、激光扫描、NLP这些硬科技全上了,科沃斯:技术创新才能打破行业内卷
4600
Lnton羚通智能分析算法智能机器人系统
4780
「机器人感知与控制关键技术」最新2023研究综述
3.3K0
扫地机器人“眼睛”进化史
8060
四大势力暗战 3D 视觉
2780
视觉方案好几种,我为何更看好双目视觉
3.8K0
从刷脸支付到刷掌支付,3D视觉公司的新机会?
5590
相关推荐
专访INDEMIND:机器人视觉导航将成行业主流
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档