(數據結構)線性表(上):SeqList 順序表

線性表(上):Seqlist 順序表

  • 基本了解
    • 線性表
    • 順序表
    • 靜態順序表
    • 動態順序表
  • 編寫動態順序表
    • 項目結構
    • 基礎結構
    • 初始化
    • 尾插
    • 頭插
    • 尾刪
    • 頭刪
    • 查找
    • 指定位置pos之前插入數據
    • 刪除指定位置pos的數據
    • 銷毀
    • 完整代碼
      • SeqLIst.h
      • SeqLIst.c
      • test.c
  • 算法題
    • 移除元素
    • 刪除有序數組中的重復項

基本了解

線性表

線性表(linear list)是n個具有相同特性的數據元素的有限序列。 線性表是?種在實際中?泛使 ?的數據結構,常?的線性表:順序表、鏈表、棧、隊列、字符串…
線性表在邏輯上是線性結構,也就說是連續的?條直線。但是在物理結構上并不?定是連續的, 線性表在物理上存儲時,通常以數組和鏈式結構的形式存儲。

順序表

概念:順序表是??段物理地址連續的存儲單元依次存儲數據元素的線性結構,?般情況下采?數組存儲。順序表一般分為靜態順序表和動態順序表。
在這里插入圖片描述

靜態順序表

優點:一次性開辟空間
缺點:不可改動,當數據量變化時,空間給大了會造成浪費,空間給小了容易導致數據丟失等問題。

typedef int SLDataType;
#define N 7
typedef struct SeqList {SLDataType arr[N];//定長數組int size;		//有效數據個數int capacity;	//空間大小
}SL;

動態順序表

優點:靈活可改動,隨時可擴容

typedef int SLDataType;
typedef struct SeqList {SLDataType* arr;//動態順序表,定義動態數組int size;		//有效數據個數int capacity;	//空間大小
}SL;

增容的一般邏輯:
在這里插入圖片描述

編寫動態順序表

項目結構

SeqList
├── SeqList.h	# 頭文件:定義結構、聲明
函數
├── SeqList.c	# 實現文件:函數具體實現└── test.c		# 測試文件:每寫一個功能以后都要測試一下

在這里插入圖片描述

基礎結構

SeqLIst.h 中

typedef int SLDataType;
typedef struct SeqList {SLDataType* arr;//動態順序表,定義動態數組int size;		//有效數據個數int capacity;	//空間大小
}SL;

初始化

這里有一個易錯點提醒:函數傳參時一定要思考是要傳值還是傳址,只有傳址,函數改動的才是傳過去的變量本身!
比如如果初始化函數這么寫

void SLInit(SL s) {s.arr = NULL;s.size = s.capacity = 0;
}

測試

void test01() {SL sl;SLInit(sl);
}int main() {test01();return 0;
}

在這里插入圖片描述
此時就會報這樣的錯誤,為什么呢?
因為傳值傳參,函數中形參是實參的拷貝,但sl是未初始化的變量,所以這個值拷貝無法完成,自然就會報錯了

所以注意此處進行傳址調用

void SLInit(SL* ps) {ps->arr = NULL;ps->size = ps->capacity = 0;
}
void test01() {SL sl;SLInit(&sl); //注意這里要傳地址
}int main() {test01();return 0;
}

尾插

在這里插入圖片描述

注釋中標明了易錯的步驟和知識重點

void SLPushBack(SL* ps, SLDataType x) {//尾插前先判斷順序表是否仍有位置插入if (ps->size == ps->capacity) {ps->capacity = ps->capacity == 0 ? 4 : ps->capacity * 2;//避免一開始capacity==0,做乘法以后仍為0出現問題SLDataType* tmp = (SLDataType*)realloc(ps->arr, sizeof(SLDataType) *ps->capacity*2);//用臨時指針接收realloc的返回值,防止擴容失敗返回NULL,導致影響順序表的存儲//注意realloc第二個參數單位是字節,擴容至原capacity的兩倍時,別忘了要乘上SLDataType的字節大小//realloc擴容邏輯:能就地擴就就地擴;不能就另找一塊(malloc新的內存塊)、拷貝(memcpy)、釋放舊塊(free)if (tmp == NULL) {perror("realloc fail!");//會在輸出里變成realloc fail!: Cannot allocate memoryexit(1);//直接退出程序}ps->arr = tmp;}//尾插操作,可以畫圖思考,發現size大小實時對應尾插的位置,不需要額外遍歷//記得自增size!ps->arr[ps->size++] = x;
}

測試

//測試尾插
void test02() {SL sl;SLInit(&sl);SLPushBack(&sl,1);SLPushBack(&sl, 2);SLPushBack(&sl, 3);SLPushBack(&sl, 4);SLPushBack(&sl, 5);
}
int main() {test02();return 0;
}

時間復雜度為O(n)

頭插

判滿——將數據向右挪動(從右往左依次挪!)——把新數據放到頭部
在這里插入圖片描述

判滿操作是在多個功能中都需要使用到的,所以這里我們把它單獨分出來

//判滿擴容操作
void SLCheckCapacity(SL* ps) {if (ps->size == ps->capacity) {ps->capacity = ps->capacity == 0 ? 4 : ps->capacity * 2;//避免一開始capacity==0,做乘法以后仍為0出現問題SLDataType* tmp = (SLDataType*)realloc(ps->arr, sizeof(SLDataType) * ps->capacity * 2);//用臨時指針接收realloc的返回值,防止擴容失敗返回NULL,導致影響順序表的存儲//注意realloc第二個參數單位是字節,擴容至原capacity的兩倍時,別忘了要乘上SLDataType的字節大小//realloc擴容邏輯:能就地擴就就地擴;不能就另找一塊(malloc新的內存塊)、拷貝(memcpy)、釋放舊塊(free)if (tmp == NULL) {perror("realloc fail!");//會在輸出里變成realloc fail!: Cannot allocate memoryexit(1);//直接退出程序}ps->arr = tmp;}
}
void SLPushHead(SL* ps, SLDataType x) {//檢查一下ps,如果傳入了空指針會導致程序直接報錯////比較溫和的方法//if (ps == NULL)//	return;//比較粗暴的方法:使用斷言語句assert(ps);//等價于assert(ps!=NULL)SLCheckCapacity(ps);for (int i = ps->size - 1;i >= 0;i--) {ps->arr[i + 1] = ps->arr[i];}ps->arr[0] = x;
}

時間復雜度為O(n)

尾刪

特殊條件:順序表不能為空
操作:有效數據個數size–,原來的數據不做處理也沒有關系

void SLPopBack(SL* ps) {assert(ps && ps->size);ps->size--;
}

時間復雜度O(1)

頭刪

特殊條件:順序表不能為空
操作:

  1. 讓數組從左到右往左移一位(覆蓋)
  2. 有效數據個數size–,原來的數據不做處理也沒有關系
void SLPopHead(SL* ps) {assert(ps && ps->size);for (int i = 1;i < ps->size;i++) {ps->arr[i - 1] = ps->arr[i];}ps->size--;
}

時間復雜度O(n)

查找

設定找到了返回下標,未找到返回-1

int SLFind(SL ps, SLDataType x) {for (int i = 0;i < ps.size;i++) {if (ps.arr[i] == x)return i;//找到了就返回位置}//會運行到這一定是沒有找到return -1;
}

指定位置pos之前插入數據

在指定位置pos之前插入數據,實際上新數據就放在pos位置
特殊條件:插入都要判斷空間夠不夠,刪除都要判空
且pos有限制范圍pos>=0&&pos<=size
核心操作:pos之后的數據向右挪動一位(從右往左挪)

//指定位置前插入
void SLInsert(SL* ps, int pos, SLDataType x) {assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);//插入都要判斷一下!for (int i = ps->size;i > pos;i--) {ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;ps->size++;
}

刪除指定位置pos的數據

特殊條件:刪除都要判空,且pos有限制范圍pos>=0&&pos<=size
核心操作:pos之后的數據向左挪動一位(從左往右往左挪)

//指定位置刪除數據
void SLErase(SL* ps, int pos) {assert(ps&&ps->size);assert(pos >= 0 && pos <= ps->size);for (int i = pos;i < ps->size-1;i++) {ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

銷毀

//銷毀
void SLDesTroy(SL* ps) {if (ps->arr) {//即arr非空free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}

完整代碼

SeqLIst.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int SLDataType;
typedef struct SeqList {SLDataType* arr;//動態順序表,定義動態數組int size;		//有效數據個數int capacity;	//空間大小
}SL;//初始化
void SLInit(SL* ps);//尾插
void SLPushBack(SL* ps, SLDataType x);//頭插
void SLPushHead(SL* ps, SLDataType x);//尾刪
void SLPopBack(SL* ps);//頭刪
void SLPopHead(SL* ps);//查找
int SLFind(SL ps, SLDataType x);//指定位置前插入
void SLInsert(SL* ps, int pos, SLDataType x);//指定位置刪除
void SLErase(SL* ps, int pos);//銷毀
void SLDesTroy(SL* ps);

SeqLIst.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"//初始化
void SLInit(SL* ps) {ps->arr = NULL;ps->size = ps->capacity = 0;
}//判滿擴容操作
void SLCheckCapacity(SL* ps) {if (ps->size == ps->capacity) {ps->capacity = ps->capacity == 0 ? 4 : ps->capacity * 2;//避免一開始capacity==0,做乘法以后仍為0出現問題SLDataType* tmp = (SLDataType*)realloc(ps->arr, sizeof(SLDataType) * ps->capacity * 2);//用臨時指針接收realloc的返回值,防止擴容失敗返回NULL,導致影響順序表的存儲//注意realloc第二個參數單位是字節,擴容至原capacity的兩倍時,別忘了要乘上SLDataType的字節大小//realloc擴容邏輯:能就地擴就就地擴;不能就另找一塊(malloc新的內存塊)、拷貝(memcpy)、釋放舊塊(free)if (tmp == NULL) {perror("realloc fail!");//會在輸出里變成realloc fail!: Cannot allocate memoryexit(1);//直接退出程序}ps->arr = tmp;}
}
//尾插
void SLPushBack(SL* ps, SLDataType x) {SLCheckCapacity(ps);//尾插操作,可以畫圖思考,發現size大小實時對應尾插的位置,不需要額外遍歷//記得自增size!ps->arr[ps->size++] = x;
}//頭插
void SLPushHead(SL* ps, SLDataType x) {//檢查一下ps,如果傳入了空指針會導致程序直接報錯////比較溫和的方法//if (ps == NULL)//	return;//比較粗暴的方法:使用斷言語句assert(ps);//等價于assert(ps!=NULL)SLCheckCapacity(ps);for (int i = ps->size - 1;i >= 0;i--) {ps->arr[i + 1] = ps->arr[i];}ps->arr[0] = x;//記得自增size!ps->size++;
}//尾刪
void SLPopBack(SL* ps) {assert(ps && ps->size);ps->size--;
}//頭刪
void SLPopHead(SL* ps) {assert(ps && ps->size);for (int i = 1;i < ps->size;i++) {ps->arr[i - 1] = ps->arr[i];}ps->size--;
}//查找
int SLFind(SL ps, SLDataType x) {for (int i = 0;i < ps.size;i++) {if (ps.arr[i] == x)return i;//找到了就返回位置}//會運行到這一定是沒有找到return -1;
}//指定位置前插入
void SLInsert(SL* ps, int pos, SLDataType x) {assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);//插入都要判斷一下!for (int i = ps->size;i > pos;i--) {ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;ps->size++;
}//指定位置刪除數據
void SLErase(SL* ps, int pos) {assert(ps&&ps->size);assert(pos >= 0 && pos <= ps->size);for (int i = pos;i < ps->size-1;i++) {ps->arr[i] = ps->arr[i + 1];}ps->size--;
}//銷毀
void SLDesTroy(SL* ps) {if (ps->arr) {//即arr非空free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"//測試初始化
void test01() {SL sl;SLInit(&sl);
}void test02() {SL sl;SLInit(&sl);//SLPushBack(&sl, 1);//SLPushBack(&sl, 2);//SLPushBack(&sl, 3);//SLPushBack(&sl, 4);//SLPushBack(&sl, 5);SLPushHead(&sl, 1);SLPushHead(&sl, 2);SLPushHead(&sl, 3);SLPushHead(&sl, 4);SLPushHead(&sl, 5);/*for (int i = 0;i < sl.size;i++) {printf("%d ", sl.arr[i]);}printf("\n");SLPopHead(&sl);for (int i = 0;i < sl.size;i++) {printf("%d ", sl.arr[i]);}printf("\n");SLPopBack(&sl);for (int i = 0;i < sl.size;i++) {printf("%d ", sl.arr[i]);}printf("\n");*///測試findSLErase(&sl, 2);for (int i = 0;i < sl.size;i++) {printf("%d ", sl.arr[i]);}printf("\n");SLInsert(&sl, 2, 7);for (int i = 0;i < sl.size;i++) {printf("%d ", sl.arr[i]);}printf("\n");
}int main() {test02();return 0;
}

算法題

移除元素

在這里插入圖片描述
本題首先要審題,弄明白評測需要什么

  1. 返回非val的值的個數
  2. 修改nums,使它的前k個數必須是非val的值(順序不變),后面的數不管。
    在這里插入圖片描述
    新數組法:創建一個與nums長度相同的新數組,只選取不等于val的值存儲進去,同時進行計數。再將新數組遍歷賦回給nums。(之前也說過,這個方法是以空間換時間的方法)
    雙“指針”法
    簡述思路:記錄兩個下標,一個負責探路,一個負責存儲和計數,一次遍歷中兩個下標同時發揮其作用。
    在這里插入圖片描述
int removeElement(int* nums, int numsSize, int val) {int src=0,dst=0;while(src<numsSize){if(nums[src]!=val){nums[dst]=nums[src];dst++;}src++;}return dst;
}

刪除有序數組中的重復項

https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/
在這里插入圖片描述
注意題目強調有序數組,這意味著重復項都在一起,要利用好這個特性。
新數組法
創建一個與nums長度相同的新數組,只選取符合條件的數字進去,再將新數組遍歷賦回給nums。
雙"指針"法
畫圖思考讓思路更清晰!
依然是src負責讀取數據,dst負責錄入數據和返回數據數量
想象src在數組上面走,dst在數組下面走。
在這里插入圖片描述

int removeDuplicates(int* nums, int numsSize) {int src=1,dst=0;//因為第一個元素一定算數,所以src可以從1開始走while(src<numsSize){if(nums[src]!=nums[dst]){nums[++dst]=nums[src];}src++;}return dst+1;
}

這個代碼還可以做進一步優化,減少沒必要的賦值操作:
當nums[src]!=nums[dst]時,如果src只比dst小1, nums[++dst]=nums[src];就相當于這個值自己給自己賦了,所以我們可以據此對代碼進一步優化。

int removeDuplicates(int* nums, int numsSize) {int src=1,dst=0;//因為第一個元素一定算數,所以src可以從1開始走while(src<numsSize){if(nums[src]!=nums[dst]&&++dst!=src){nums[dst]=nums[src];}src++;}return dst+1;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/91634.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91634.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91634.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WebStorm vs VSCode:前端圈的「豆腐腦甜咸之爭」

目錄 一、初識兩位主角&#xff1a;老司機與新勢力 二、開箱體驗&#xff1a;是「拎包入住」還是「毛坯房改造」 三、智能提示&#xff1a;是「知心秘書」還是「百度搜索」 四、調試功能&#xff1a;是「CT 掃描儀」還是「聽診器」 五、性能表現&#xff1a;是「重型坦克」…

C#將類屬性保存到Ini文件方法(利用拓展方法,反射方式獲取到分組名和屬性名稱屬性值)

前言&#xff1a;最近學習C#高級課程&#xff0c;里面學到了利用反射和可以得到屬性的特性、屬性名、屬性值&#xff0c;還有拓展方法&#xff0c;一直想將學到的東西利用起來&#xff0c;剛好今天在研究PropertyGrid控件時&#xff0c;想方便一點保存屬性值到配置文件&#xf…

kafka 單機部署指南(KRaft 版本)

目錄環境準備JDK安裝下載jdkjdk安裝kafka 部署kafka 下載kafka 版本號結構解析kafka 安裝下載和解壓安裝包配置 KRaft 模式格式化存儲目錄啟動kafkaKafka 配置為 systemd 服務注意事項調整 JVM 內存參數Kafka KRaft 版本&#xff08;即 Kafka 3.0 及更高版本&#xff09;使用 K…

websocket案例 599足球比分

目標地址:aHR0cHM6Ly93d3cuNTk5LmNvbS9saXZlLw接口:打開控制臺 點websocket 刷新頁面 顯示分析:不寫理論了關于websocket 幾乎發包位置都是下方圖片 不管抖音還是快手 等平臺這里在進行 new WebSocket 后 是要必須走一步的 也就是 new WebSocket().onopen() 也就是onopen 進行向…

【后端】Linux系統發布.NetCore項目

目錄 1.設置全球化不變模式 1.發布到文件 3. 配置為服務 3.1.添加服務 3.2.添加執行權限 3.3.啟動服務 4.訪問 1.設置全球化不變模式 雙擊所需項目&#xff0c;設置全球化不變模式 <!-- 設置全球化不變模式 --><RuntimeHostConfigurationOption>System.Globa…

CMU-15445(2024fall)——PROJECT#0

題目介紹 這是題目原文。 注意&#xff1a;在拉取項目的時候需要注意拉取2024fall的Tag&#xff0c;本人血淚教訓&#xff01; 本題是關于HyperLogLog的具體實現&#xff0c;其介紹可以看這個視頻進行了解。簡單來說HyperLogLog可以在一個非常小的固定內存下&#xff08;一般…

使用微信免費的圖像處理接口,來開發圖片智能裁剪和二維碼/條碼識別功能,爽歪歪

大家好&#xff0c;我是小悟。 1、圖片智能裁剪 我們先來了解一下圖片智能裁剪。圖片智能裁剪聚焦于數字圖像的智能化處理。AI技術的引入徹底改變了傳統依賴人工框選的裁剪模式。 通過深度學習模型自動識別圖像主體&#xff08;人物、商品等&#xff09;&#xff0c;能在極短時…

【代碼隨想錄】+ leetcode hot100:棧與隊列算法專題總結、單調棧

大家好&#xff0c;我是此林。 今天分享的是【代碼隨想錄】棧與隊列算法專題總結&#xff0c;分享刷算法的心得體會。 1. 用棧實現隊列、用隊列實現棧 232. 用棧實現隊列 - 力扣&#xff08;LeetCode&#xff09; 225. 用隊列實現棧 - 力扣&#xff08;LeetCode&#xff09;…

《5分鐘開發訂單微服務!飛算JavaAI實戰:IDEA插件安裝→空指針修復→K8s部署全流程》

目錄 40倍提升開發效能的秘密武器 一、為什么選擇飛算JavaAI&#xff1f;?編輯 二、IDEA插件安裝三步曲&#xff08;極簡版&#xff09; 步驟1&#xff1a;安裝插件&#xff08;30秒完成&#xff09; 步驟2&#xff1a;賬號登錄&#xff08;2種方式任選&#xff09; 方式…

SQL注入基礎嘗試

進入網址&#xff0c;測試正常回顯和出錯畫面http://1bcf75af-6e69-4f78-ac71-849fb8cde1b5.node5.buuoj.cn/Less-2/? id1用特殊符號判斷注入點判斷其類型類型為數字型&#xff0c;order by判斷列數當數字為4時候報錯而3不報錯&#xff0c;由此推斷列數為3&#xff0c;接著測試…

[Dify] -進階4-在 Dify 中實現 PDF 文檔問答功能全流程

隨著業務需求增加,AI 應用常遇到讓模型“讀懂”PDF并回答問題的場景。借助 Dify 的 RAG(Retrieval?Augmented Generation)能力,我們可以構建一個“ChatPDF”式的互動問答機器人。本文詳細講解從環境搭建、PDF 上傳、文本抽取、向量檢索到問答部署的完整流程。 一、技術棧與…

【EPLAN 2.9】許可證xx成功卻顯示紅色叉,無法啟動

問題現象&#xff1a; 無法啟動。 原因&#xff1a;通過mstsc遠程桌面連接會占用顯卡&#xff0c;導致調用顯卡的軟件無法成功。參考&#xff1a;Windows自帶遠程桌面(mstsc)在遠程時無法啟動&#xff08;打開&#xff09;某些應用&#xff08;軟件&#xff09;的解決辦法 編寫…

Oracle ADG 一鍵自動化搭建腳本

前言在 Oracle 數據庫高可用架構中&#xff0c;Active Data Guard (ADG) 是保障數據安全和業務連續性的核心方案。然而傳統 ADG 搭建涉及數十項復雜配置&#xff08;監聽、TNSNAMES、參數文件、密碼文件、日志傳輸、應用服務等&#xff09;&#xff0c;步驟繁瑣且易錯&#xff…

某郵生活旋轉驗證碼識別

注意,本文只提供學習的思路,嚴禁違反法律以及破壞信息系統等行為,本文只提供思路 如有侵犯,請聯系作者下架 本文識別已同步上線至OCR識別網站: http://yxlocr.nat300.top/ocr/other/30 旋轉驗證碼數據集如下: 看起來很像頂象的,都有著綠邊干擾,那其實思路也能簡單了,…

基于Android的景點旅游信息系統App

項目介紹用戶分為普通用戶和管理員兩種角色。 1.管理員有用戶管理、景點管理、評論管理功能。 2.用戶管理包括查看已注冊用戶列表、刪除用戶&#xff1b; 3.景點管理包括增加景點信息、修改景點信息、刪除景點信息、將景點設為推薦&#xff1b; 4.評論管理包括查看評論內容、刪…

Python----NLP自然語言處理(詞向量與詞嵌入)

一、詞向量與詞嵌入將文本語料分詞后&#xff0c;接下來就可以讓計算機學習這些詞&#xff0c;理解這些詞的含義。我們可以直接將文本數據輸入到計算機中讓計算機學習嗎&#xff1f;不可以&#xff0c;計算機只能看懂數字&#xff0c;看不懂文字。所以我們需要將詞語轉成一串數…

八、DMSP/OLS、NPP/VIIRS等夜間燈光數據能源碳排放空間化——碳排放空間分級、空間自相關

一、前言 前面已經將反演后能源碳排放提取、增長率、Slope趨勢法分析做了介紹,本節就是給大家介紹如何制作碳排放空間分級和空間自相關的一些具體操作步驟,其實網上也有比較多的各類學習資源,但是質量就層次不齊。這里就給大家詳細從頭到尾說明白解釋清楚如何獲取下圖這些成…

【電腦】鼠標的基礎知識

下面是一些關于鼠標的詳細知識&#xff1a;鼠標的基本結構外殼&#xff1a;通常由塑料或金屬制成&#xff0c;提供手握的地方。滾輪&#xff1a;位于中央&#xff0c;用于滾動頁面。有些高端型號的滾輪可以自定義功能。按鍵&#xff1a;最常見的是左鍵、右鍵和中鍵&#xff08;…

A33-vstar筆記及資料分享:搭建交叉編譯環境

前言 本篇主要是介紹博主在構建A33-vstar開發板鏡像時的步驟&#xff0c;也踩了一些坑&#xff0c;才整理出來&#xff0c;如果有錯誤&#xff0c;還請指正。 A33-vstar開發板的資料&#xff1a; 通過網盤分享的文件&#xff1a;A33-Vstar開發板資料合集 鏈接: https://pan.bai…

基于51單片機智能家居監控系統設計

摘 要 智能家居是以住宅為平臺&#xff0c;利用綜合布線技術、網絡通信技術、安全防范技術、自動控制技術、音視頻技術將家居生活有關的設施集成&#xff0c;構建高效的住宅設施與家庭日程事務的管理系統&#xff0c;提升家居安全性、便利性、舒適性、藝術性&#xff0c;并實現…