Өмнөх хэсгүүдэд (
Практикт сийрэг массивууд нь ихэвчлэн маш том хэмжээтэй байдаг тул санах ойг ижил элементүүдээр эзлэх нь утгагүй юм. Тиймээс ижил утгыг хадгалахад санах ойг дэмий үрэхгүй байхаар сийрэг массивуудыг хэрэгжүүлэх нь зүйтэй юм.
Зарим програмчлалын хэлэнд сийрэг массивууд нь тухайн хэлэнд багтдаг.
Глобалчууд сийрэг массивуудыг хэрэгжүүлэхэд сайн нэр дэвшигчид байдаг, учир нь:
- Тэд зөвхөн тодорхой зангилааны утгыг хадгалдаг бөгөөд тодорхойгүй байгаа утгыг хадгалдаггүй;
- Зангилааны утгад хандах интерфэйс нь олон хэмжээст массивын элементэд хандах хандалтыг хэдэн програмчлалын хэл хэрэгжүүлдэгтэй маш төстэй юм.
Set ^a(1, 2, 3)=5 Write ^a(1, 2, 3)
- Глобал бол өгөгдөл хадгалах нэлээд доогуур түвшний бүтэц тул хурдны гайхалтай шинж чанартай байдаг (техник хангамжаас хамааран секундэд хэдэн зуун мянгаас хэдэн арван сая гүйлгээ хийх, доороос үзнэ үү).
1 )
Глобал нь байнгын бүтэцтэй тул RAM-ийн хэмжээ хангалтгүй байх нь урьдчилан мэдэгдэж байгаа үед тэдгээр дээр сийрэг массив үүсгэх нь утга учиртай юм.
Сийрэг массивын нэг шинж чанар нь тодорхойгүй нүдэнд хандалт хийсэн тохиолдолд анхдагч утгыг буцаах явдал юм.
Үүнийг функцийг ашиглан хэрэгжүүлж болно
SET a = $GET(^a(x,y,z), defValue)
Ямар даалгаварууд нь сийрэг массив шаарддаг бөгөөд глобалууд хэрхэн туслах вэ?
Зэргэлдээ (холболт) матриц
График том байх тусам матрицад тэг их байх нь ойлгомжтой. Жишээлбэл, бид нийгмийн сүлжээний графикийг аваад ижил төстэй матриц хэлбэрээр үзүүлбэл энэ нь бараг бүхэлдээ тэгээс бүрдэх болно, өөрөөр хэлбэл. сийрэг массив байх болно.
Set ^m(id1, id2) = 1
Set ^m(id1, id3) = 1
Set ^m(id1, id4) = 1
Set ^m(id1) = 3
Set ^m(id2, id4) = 1
Set ^m(id2, id5) = 1
Set ^m(id2) = 2
....
Энэ жишээн дээр бид дэлхий даяар хэмнэлт гаргадаг ^m холболтын матриц, түүнчлэн зангилаа тус бүрийн ирмэгийн тоо (хэнтэй найз нөхөд, найз нөхдийн тоо).
График дахь элементийн тоо 29 саяас ихгүй байвал (энэ тоог 8 *-ын үржвэрээр авна)
Битийн мөр бүхий залруулга нь функцээр хийгддэг
; установка бита
SET $BIT(rowID, positionID) = 1
; получение бита
Write $BIT(rowID, positionID)
Төрийн машины шилжилтийн хүснэгт
Хязгаарлагдмал автоматын шилжилтийн график нь энгийн график тул төгсгөлтэй автоматын шилжилтийн хүснэгт нь дээр дурдсан зэргэлдээх матрицтай ижил байна.
Үүрэн автомат
Хамгийн алдартай үүрэн автомат машин
Стивен Вольфрам үүрэн автомат гэж үздэг
Компьютер дээр ажиллах боломжтой аливаа алгоритмыг үүрэн автомат машин ашиглан хэрэгжүүлж болох нь батлагдсан. Үүрэн автоматыг динамик орчин, системийг загварчлах, алгоритмын асуудлыг шийдвэрлэх болон бусад зорилгоор ашигладаг.
Хэрэв бид асар том талбайтай бөгөөд үүрэн автоматын бүх завсрын төлөвийг бүртгэх шаардлагатай бол глобалыг ашиглах нь утга учиртай юм.
Зураг зүй
Сийрэг массивыг ашиглах үед миний санаанд орж ирдэг хамгийн эхний зүйл бол зураглалын даалгаврууд юм.
Дүрмээр бол газрын зураг дээр маш их хоосон зай байдаг. Хэрэв газрын зургийг том пикселээр дүрсэлсэн бол дэлхийн пикселийн 71% -ийг далай эзэлнэ. Сийрэг массив. Хэрэв та зөвхөн хүний гараар хийсэн бүтээлийг хэрэглэвэл хоосон зай 95% -иас их байх болно.
Мэдээжийн хэрэг, хэн ч газрын зургийг растер массив хэлбэрээр хадгалдаггүй, вектор дүрслэлийг ашигладаг.
Гэхдээ вектор газрын зураг гэж юу вэ? Энэ бол цэгүүдээс бүрдэх нэг төрлийн хүрээ ба полилин, олон өнцөгт юм.
Үндсэндээ цэгүүд болон тэдгээрийн хоорондын холболтын мэдээллийн сан юм.
Газрын зургийн хамгийн том зорилтуудын нэг бол манай галактикийг зураглах Гаиа телескопын даалгавар юм. Дүрсээр хэлбэл, манай галактик нь бүхэл бүтэн орчлон ертөнцтэй адил тасралтгүй сийрэг массив юм: ховор жижиг цэгүүд - одууд байдаг асар том хоосон орон зай. Хоосон зай нь 99,999999…….%. Манай галактикийн газрын зургийг хадгалахын тулд дэлхийн мэдээллийн санг сонгосон - Caché.
Би энэ төсөл дэх глобалуудын бүтцийг яг таг мэдэхгүй байна, би үүнийг дараахтай төстэй зүйл гэж таамаглаж байна.
Set ^galaxy(b, l, d) = 1; Номер звезды по каталогу, если есть
Set ^galaxy(b, l, d, "name") = "Sun"
Set ^galaxy(b, l, d, "type") = "normal" ; варианты blackhole, quazar, red_dwarf и т.д.
Set ^galaxy(b, l, d, "weight") = 14E50
Set ^galaxy(b, l, d, "planetes") = 7
Set ^galaxy(b, l, d, "planetes", 1) = "Mercury"
Set ^galaxy(b, l, d, "planetes", 1, weight) = 1E20
...
b, l, d хаана байна
Глобалын уян хатан бүтэц нь одод болон гаригуудын шаардлагатай шинж чанаруудыг хадгалах боломжийг олгодог, учир нь дэлхийн суурь нь схемгүй байдаг.
Манай орчлон ертөнцийн газрын зургийг хадгалахын тулд Caché-г зөвхөн уян хатан чанараараа бус, мэдээллийн урсгалыг маш хурдан хадгалах чадвартай, нэгэн зэрэг хурдан хайлт хийхэд индексийн глобал үзүүлэлтийг бий болгосноор сонгосон.
Хэрэв бид дэлхий рүү буцаж ирэх юм бол дэлхийн хэмжээнд зураг зүйн төслүүд бий болсон
Саяхан
OpenStreetMap XAPI дээр дэлхийн хэмжээнд орон зайн индексийг хэрэгжүүлэх
-аас авсан зургууд
Бөмбөрцгийг бүхэлд нь дөрвөлжин, дараа нь дэд дөрвөлжин, дэд дөрвөлжин дэд дөрвөлжин гэх мэтээр хуваана. Ерөнхийдөө бид ямар глобалууд бүтээгдсэнийг хадгалах шаталсан бүтцийг олж авдаг.
Хэзээ ч бид хүссэн квадратаа бараг тэр даруйд нь шаардах эсвэл арилгах боломжтой бөгөөд бүх дэд дөрвөлжингууд мөн буцаагдах эсвэл цэвэрлэх болно.
Глобал дээрх ижил төстэй схемийг хэд хэдэн аргаар хэрэгжүүлж болно.
Сонголт 1:
Set ^m(a, b, a, c, d, a, b,c, d, a, b, a, c, d, a, b,c, d, a, 1) = idПервойТочки
Set ^m(a, b, a, c, d, a, b,c, d, a, b, a, c, d, a, b,c, d, a, 2) = idВторойТочки
...
Сонголт 2:
Set ^m('abacdabcdabacdabcda', 1) = idПервойТочки
Set ^m('abacdabcdabacdabcda', 2) = idВторойТочки
...
Аль ч тохиолдолд COS/M-г ашиглан аль ч түвшний квадратад байрлах цэгүүдийг хүсэх нь тийм ч хэцүү биш юм. Эхний хувилбарт аль ч түвшинд дөрвөлжин талбайг цэвэрлэх нь арай хялбар байх болно, гэхдээ энэ нь ховор шаардлагатай байдаг.
Доод түвшний квадратуудын нэг жишээ:
XAPI төслийн хэд хэдэн глобалыг энд оруулав: Глобал дахь индексийн төлөөлөл:
дэлхийн ^ зам цэгүүдийг хадгалахад ашигладаг
Глобал дээр сийрэг массивыг ашиглах бүдүүлэг ангилал.
- Бид тодорхой объектын координат, тэдгээрийн төлөвийг (газрын зураг, үүрэн автомат) хадгалдаг.
- Бид сийрэг матрицуудыг хадгалдаг.
Тохиолдол 2) элементэд утга өгөгдөөгүй тодорхой координатыг хүсэх үед бид анхдагч сийрэг массив элементийн утгыг авах ёстой.
Олон хэмжээст матрицыг дэлхийн хэмжээнд хадгалахад бидэнд олгодог урамшуулал
Олон эгнээ, хавтгай, шоо гэх мэт зайны хэсгүүдийг хурдан арилгах ба/эсвэл сонгох. Бүхэл тоон индекс ашиглаж байгаа тохиолдолд олон мөр, хавтгай, шоо гэх мэт орон зайн хэсгүүдийг хурдан арилгах ба/эсвэл авчрах чадвар ашигтай байж болно.
баг
Зураг нь дэлхийн хэмжээнд гурван хэмжээст массивыг харуулж байна ^a болон янз бүрийн төрлийн устгах.
Мэдэгдэж буй индексүүдийг ашиглан зайны хэсгүүдийг сонгохын тулд та тушаалыг ашиглаж болно
Column хувьсагч руу матриц баганыг сонгох:
; Зададим трёхмерный разреженный массив 3x3x3
Set ^a(0,0,0)=1,^a(2,2,0)=1,^a(2,0,1)=1,^a(0,2,1)=1,^a(2,2,2)=1,^a(2,1,2)=1
Merge Column = ^a(2,2)
; Выведем переменную Column
Zwrite Column
Дүгнэлт:
Column(0)=1
Column(2)=1
Column хувьсагчийн хамгийн сонирхолтой зүйл бол бидэнд бас сийрэг массив байгаа бөгөөд үүнд мөн дамжуулан хандах шаардлагатай.
Орон зайн хэсгүүдийг сонгохдоо функцийг ашиглан жижиг програмаар дамжуулан хийж болно
дүгнэлт
Одоогийн цаг үе шинэ амбицтай зорилтуудыг тавьж байна. Графикууд нь хэдэн тэрбум оройноос, газрын зураг нь хэдэн тэрбум цэгээс бүрдэх ба зарим нь үүрэн автомат төхөөрөмж дээр өөрийн орчлон ертөнцийг ажиллуулахыг хүсдэг (
Хэрэв сийрэг массивуудын өгөгдлийн хэмжээ нь RAM-д багтахаа больсон ч та тэдэнтэй ажиллах шаардлагатай бол дэлхийн болон COS дээр ижил төстэй төслүүдийг хэрэгжүүлэх боломжийг авч үзэх нь зүйтэй юм.
Анхаарал тавьсанд баярлалаа! Бид таны асуулт, хүслийг сэтгэгдэл дээр хүлээж байна.
Disclaimer: Энэ нийтлэл болон түүнд өгсөн миний санал бол миний бодол бөгөөд InterSystems корпорацийн албан ёсны байр суурьтай ямар ч холбоогүй юм.
Эх сурвалж: www.habr.com