আমি কীভাবে ন্যূনতম এন পয়েন্ট যুক্ত অনিয়মিত গ্রিড তৈরি করতে পারি?


20

অসম বিতরণিত পয়েন্টগুলির একটি বৃহত্তর (million 1 মিলিয়ন) নমুনা দেওয়া - এটি অনিয়মিত গ্রিড উত্পন্ন করা সম্ভব (আকারে, তবে এটি সম্ভব হলে আকারেও অনিয়মিত হতে পারে?) এতে নির্দিষ্ট ন্যূনতম পরিমাণে এন পয়েন্ট থাকবে?

যদি এই জাতীয় গ্রিডের উত্পন্ন 'কোষগুলিতে ঠিক n সংখ্যা বা কমপক্ষে n পয়েন্ট থাকে তবে তা আমার পক্ষে কম গুরুত্বপূর্ণ ।

আমি আর্কজিআইএস-এ জেনভেকগ্রিডের মতো সমাধানগুলি বা কিউজিআইএস / এমএমজি-তে গ্রিড স্তর তৈরির বিষয়ে সচেতন, তবে তারা সকলেই নিয়মিত গ্রিড তৈরি করবে যার ফলে খালি কোষ (ছোট সমস্যা - আমি কেবল এগুলি বাতিল করতে পারি) বা পয়েন্ট গণনা সহ কোষগুলির সাথে আউটপুট তৈরি করবে will এন এর চেয়ে কম (বড় সমস্যা যেহেতু cells কোষগুলিকে একত্রিত করার জন্য আমার একটি সমাধান প্রয়োজন, সম্ভবত এখান থেকে কিছু সরঞ্জাম ব্যবহার করছেন ?)।

আমি কোনও লাভই করতে পারছি না এবং বাণিজ্যিক (আরকজিআইএস এবং এক্সটেনশনগুলি) বা ফ্রি (পাইথন, পোস্টজিআইএস, আর) উভয়ের জন্যই আমি উন্মুক্ত।


1
গ্রিডটি কতটা "নিয়মিত" হওয়া দরকার? আমি ভাবছি যদি আপনি কিছু শ্রেণিবিন্যাসমূলক ক্লাস্টারিং করতে পারেন এবং আপনার প্রয়োজন মেটাতে কেবল ডেনড্রোগ্রামটি কেটে ফেলুন (যদিও এটি সম্ভবত প্রসারিত যা নিয়মিত স্থানিক কনফিগারেশন হিসাবে সংজ্ঞায়িত হবে)। ক্রাইমস্ট্যাট ডকুমেন্টেশনে এই ধরণের ক্লাস্টারিংয়ের কয়েকটি ভাল উদাহরণ রয়েছে ।
অ্যান্ডি ডব্লিউ

5
আপনি একটি "অনিয়মিত গ্রিড" বলতে চাইছেন ঠিক কি ব্যাখ্যা করতে পারেন? এটি অক্সিমোরনের মতো শোনাচ্ছে :-)। আরও লক্ষণীয় বিষয়, এই মহড়ার উদ্দেশ্য কী হবে? নোট, এছাড়াও, অতিরিক্ত মানদণ্ড বা সীমাবদ্ধতা সম্ভবত প্রয়োজন: সর্বোপরি, আপনি যদি 1 মিলিয়ন পয়েন্টের চারপাশে একটি স্কোয়ার আঁকেন, তবে এটি একটি গ্রিডের অংশ হিসাবে বিবেচনা করা যেতে পারে এবং এতে সেগুলির মধ্যে n এরও বেশি থাকবে । আপনি সম্ভবত এই তুচ্ছ সমাধানটির যত্ন নেবেন না, তবে: কেন, ঠিক তাই নয়?
শুক্র

অ্যানডাব্লু ধন্যবাদ ভাল ধারণা এবং অন্বেষণ করার উপযুক্ত। একবার দেখে নিবেন অগ্রাধিকার (ডাটা গোপনীয়তা কারণে) 'লুকান' হয় - ফাইলের আকার & 'গ্রিড' আকৃতি আমার জন্য মাধ্যমিক গুরুত্ব রয়েছে এন পিছনে এক অতিরিক্ত বৈশিষ্ট্যগুলিও উপস্থিত রয়েছে
radek

@ শুভও ধন্যবাদ। আমি সম্মত হই - তবে আমি কীভাবে এ জাতীয় বিভাজনটির নাম দিতে পারি তা নিশ্চিত ছিল না। উপরে উল্লিখিত হিসাবে - আমার মূল প্রেরণা হ'ল ডেটা গোপনীয়তা। পাঁচটি পয়েন্টের অবস্থান (যা আমি চূড়ান্ত মানচিত্রে প্রদর্শিত করতে পারি না) তাদের আচ্ছাদন ক্ষেত্রের দ্বারা আমি তাদের উপস্থাপন করতে চাই; এবং গড় / মিডিয়ান / ইত্যাদি পান। তার জন্য মান। আমি সম্মত হই যে সেগুলির সকলকে উপস্থাপন করে একটি আয়তক্ষেত্র বা উত্তল হুল আঁকানো সম্ভব হবে - এটি আমার ধারণা চূড়ান্ত ডেটা গোপনীয়তা সুরক্ষা হবে? ;] তবে - আকারের বাউন্ডিং দ্বারা এটি উপস্থাপন করা আরও কার্যকর হবে, এর 10 টি বৈশিষ্ট্য বলি। তারপরে - আমি এখনও স্থানিক প্যাটার্ন সংরক্ষণ করতে পারি।
রাদেক

1
আইএমও আপনার বিবরণ দিয়েছিল আমি একধরণের প্রবণতা ব্যবহার করব এবং একটি রাস্টার মানচিত্র প্রদর্শন করব (সম্ভবত একটি নমনীয় ব্যান্ডউইথ আপনার সর্বনিম্ন এন এর আকার ডেটা মসৃণ করতে যথেষ্ট হবে)। যতক্ষণ না ক্রাইমস্ট্যাট, আমি ব্যবহার করেছি সবচেয়ে বড় ফাইলগুলি আমার বিশ্বাস প্রায় 100,000 কেস (এবং ক্লাস্টারিং অবশ্যই সময় লাগবে)। সম্ভবত আপনি আপনার ডেটাটিকে কম কেস হিসাবে উপস্থাপন করতে কিছু প্রাক-জেনারালাইজেশন করতে পারেন এবং আপনি যা চান তার জন্য এখনও পছন্দসই ফলাফল পেতে পারেন। এটি একটি খুব সাধারণ প্রোগ্রাম, আমি এটি চেষ্টা করে দেখতে এবং নিজের জন্য কয়েক মিনিট সময় নেওয়ার পরামর্শ দেব would
অ্যান্ডি ডাব্লু

উত্তর:


26

আমি দেখছি মির্সিভিকিং একটি চতুর্থাংশের প্রস্তাব দিয়েছে । আমি একই জিনিসটি বলতে যাচ্ছিলাম এবং এটি ব্যাখ্যা করার জন্য, এখানে কোড এবং একটি উদাহরণ রয়েছে। কোডটি লিখিত আছে Rতবে সহজেই বলা উচিত, পাইথন port

ধারণাটি লক্ষণীয়ভাবে সহজ: বিন্দুটিকে প্রায় অর্ধেকটি এক্স-দিক দিয়ে বিভক্ত করুন, তারপরে অবিচ্ছিন্নভাবে দুটি অংশকে Y- দিক বরাবর বিভক্ত করুন, প্রতিটি স্তরের দিক পরিবর্তন করে, যতক্ষণ না কোনও বিভাজন পছন্দ না হয়।

উদ্দেশ্য হ'ল প্রকৃত পয়েন্টের অবস্থানগুলি ছদ্মবেশ করা, এটি বিভাজনের মধ্যে কিছু এলোমেলোতা প্রবর্তন করা দরকারী । এটির একটি দ্রুত সহজ উপায় হ'ল 50% থেকে দূরে একটি ছোট এলোমেলো পরিমাণে কোয়ান্টাইল সেটে বিভক্ত হওয়া। এই ফ্যাশনে (ক) বিভাজক মানগুলি ডেটা স্থানাঙ্কের সাথে একত্রিত হওয়ার পক্ষে অত্যন্ত সম্ভাবনা নেই, যাতে পয়েন্টগুলি বিভাজন দ্বারা নির্মিত কোয়াড্রেন্টগুলিতে স্বতন্ত্রভাবে পতিত হয় এবং (খ) বিন্দু স্থানাঙ্কগুলি চতুষ্কোণ থেকে অবিকল পুনর্গঠন করা অসম্ভব হবে।

যেহেতু উদ্দেশ্যটি kপ্রতিটি চতুর্ভুজ পাতার মধ্যে ন্যূনতম পরিমাণ নোড বজায় রাখার জন্য, আমরা চতুর্দিকে একটি সীমাবদ্ধ ফর্মটি প্রয়োগ করি। এটি (1) গ্রুপগুলির মধ্যে ক্লাস্টারিং পয়েন্টগুলিকে সমর্থন করবে যা প্রতিটি এবং k2 * k-1 উপাদানগুলির মধ্যে রয়েছে এবং (2) চতুর্ভুজগুলিকে ম্যাপিং করবে।

এই Rকোডটি নোড এবং টার্মিনাল পাতার একটি গাছ তৈরি করে, শ্রেণি দ্বারা তাদের আলাদা করে। ক্লাস লেবেল পোস্ট-প্রসেসিং যেমন প্লট করা, নীচে দেখানো ত্বরান্বিত করে। কোডগুলি আইডির জন্য সংখ্যাসূচক মান ব্যবহার করে। এটি গাছে 52 টি গভীরতা পর্যন্ত কাজ করে (ডাবল ব্যবহার করে; স্বাক্ষরযুক্ত দীর্ঘ পূর্ণসংখ্যার ব্যবহার করা হলে সর্বাধিক গভীরতা 32)। গভীর গাছগুলির জন্য (যা কোনও প্রয়োগে খুব বেশি সম্ভাবনা নেই, কারণ কমপক্ষে k* 2 ^ 52 পয়েন্ট জড়িত থাকতে পারে), আইডিগুলিতে স্ট্রিং থাকতে হবে।

quadtree <- function(xy, k=1) {
  d = dim(xy)[2]
  quad <- function(xy, i, id=1) {
    if (length(xy) < 2*k*d) {
      rv = list(id=id, value=xy)
      class(rv) <- "quadtree.leaf"
    }
    else {
      q0 <- (1 + runif(1,min=-1/2,max=1/2)/dim(xy)[1])/2 # Random quantile near the median
      x0 <- quantile(xy[,i], q0)
      j <- i %% d + 1 # (Works for octrees, too...)
      rv <- list(index=i, threshold=x0, 
                 lower=quad(xy[xy[,i] <= x0, ], j, id*2), 
                 upper=quad(xy[xy[,i] > x0, ], j, id*2+1))
      class(rv) <- "quadtree"
    }
    return(rv)
  }
  quad(xy, 1)
}

দ্রষ্টব্য যে এই অ্যালগরিদমের পুনরাবৃত্ত ডিভাইড এবং বিজয়ী নকশা (এবং ফলস্বরূপ, বেশিরভাগ পোস্ট-প্রসেসিং অ্যালগরিদমগুলির) অর্থ সময় প্রয়োজন হয় ও (এম) এবং র‌্যামের ব্যবহার হ'ল (এন) যেখানে mসংখ্যাটি কোষ এবং nপয়েন্ট সংখ্যা। প্রতি সেল প্রতি সর্বনিম্ন পয়েন্ট দ্বারা বিভক্ত mসমানুপাতিক n,k। এটি গণনার সময়গুলি অনুমান করার জন্য দরকারী। উদাহরণস্বরূপ, যদি 50-99 পয়েন্টের (কে = 50) কোষগুলিতে n = 10 ^ 6 পয়েন্ট বিভাজনে 13 সেকেন্ড সময় লাগে, m = 10 ^ / 50 = 20000 you প্রতি সেল প্রতি পয়েন্ট (কে = 5), মি 10 গুণ বড় হয়, তাই সময় প্রায় 130 সেকেন্ডে যায়। (যেহেতু কোষগুলি ছোট হওয়ার সাথে সাথে তাদের মিডলগুলির চারপাশে স্থানাঙ্কের একটি সেট বিভক্ত করার প্রক্রিয়া দ্রুততর হয়, আসল সময়টি ছিল মাত্র 90 সেকেন্ড)) প্রতি সেলে কে = 1 পয়েন্টে যেতে, প্রায় ছয়গুণ বেশি সময় লাগবে এখনও, বা নয় মিনিট, এবং আমরা কোডটি আসলে এর চেয়ে কিছুটা দ্রুত গতিতে প্রত্যাশা করতে পারি।

আরও এগিয়ে যাওয়ার আগে আসুন কিছু আকর্ষণীয় অনিয়মিতভাবে ব্যবধানযুক্ত ডেটা তৈরি করি এবং তাদের সীমাবদ্ধ চতুষ্কোণ (0.29 সেকেন্ড অতিবাহিত সময়) তৈরি করি:

Quadtree

এই প্লট উত্পাদনের কোড এখানে। এটি Rএর পলিমারফিজমটি শোষণ করে: উদাহরণস্বরূপ, points.quadtreeযখনই pointsকোনও quadtreeবস্তুতে ফাংশন প্রয়োগ করা হয় তখন তাকে ডাকা হবে । এর ক্লাস্টার সনাক্তকারী অনুসারে পয়েন্টগুলি রঙ করার জন্য ফাংশনের চরম সরলতার মধ্যে এর শক্তিটি স্পষ্ট:

points.quadtree <- function(q, ...) {
  points(q$lower, ...); points(q$upper, ...)
}
points.quadtree.leaf <- function(q, ...) {
  points(q$value, col=hsv(q$id), ...)
}

গ্রিডটি নিজেই প্লট করা একটু কৌশলযুক্ত কারণ এর জন্য চতুর্ভুজ বিভাজনের জন্য ব্যবহৃত চৌকাঠগুলির বারবার ক্লিপিংয়ের প্রয়োজন হয়, তবে একই পুনরাবৃত্তির পদ্ধতিটি সহজ এবং মার্জিত। যদি ইচ্ছা হয় তবে কোয়ার্ট্রেন্টগুলির বহুভুজ উপস্থাপনাগুলি তৈরি করতে কোনও রূপ ব্যবহার করুন।

lines.quadtree <- function(q, xylim, ...) {
  i <- q$index
  j <- 3 - q$index
  clip <- function(xylim.clip, i, upper) {
    if (upper) xylim.clip[1, i] <- max(q$threshold, xylim.clip[1,i]) else 
      xylim.clip[2,i] <- min(q$threshold, xylim.clip[2,i])
    xylim.clip
  } 
  if(q$threshold > xylim[1,i]) lines(q$lower, clip(xylim, i, FALSE), ...)
  if(q$threshold < xylim[2,i]) lines(q$upper, clip(xylim, i, TRUE), ...)
  xlim <- xylim[, j]
  xy <- cbind(c(q$threshold, q$threshold), xlim)
  lines(xy[, order(i:j)],  ...)
}
lines.quadtree.leaf <- function(q, xylim, ...) {} # Nothing to do at leaves!

অন্য উদাহরণ হিসাবে, আমি 1,000,000 পয়েন্ট তৈরি করেছি এবং এগুলিকে প্রতিটি 5-9 এর গ্রুপে বিভক্ত করেছি। সময় ছিল 91.7 সেকেন্ড।

n <- 25000       # Points per cluster
n.centers <- 40  # Number of cluster centers
sd <- 1/2        # Standard deviation of each cluster
set.seed(17)
centers <- matrix(runif(n.centers*2, min=c(-90, 30), max=c(-75, 40)), ncol=2, byrow=TRUE)
xy <- matrix(apply(centers, 1, function(x) rnorm(n*2, mean=x, sd=sd)), ncol=2, byrow=TRUE)
k <- 5
system.time(qt <- quadtree(xy, k))
#
# Set up to map the full extent of the quadtree.
#
xylim <- cbind(x=c(min(xy[,1]), max(xy[,1])), y=c(min(xy[,2]), max(xy[,2])))
plot(xylim, type="n", xlab="x", ylab="y", main="Quadtree")
#
# This is all the code needed for the plot!
#
lines(qt, xylim, col="Gray")
points(qt, pch=".")

এখানে চিত্র বর্ণনা লিখুন


জিআইএসের সাথে কীভাবে ইন্টারঅ্যাক্ট করবেন তার উদাহরণ হিসাবে , আসুন shapefilesগ্রন্থাগারটি ব্যবহার করে সমস্ত কোয়াড্ট্রি সেলগুলি বহুভুজ আকারের ফাইল হিসাবে লিখি । কোডটির ক্লিপিং রুটিনগুলি এমুলেট করে lines.quadtreeতবে এবার এটির জন্য কোষগুলির ভেক্টর বিবরণ উত্পন্ন করতে হবে। এগুলি shapefilesলাইব্রেরির সাথে ব্যবহারের জন্য ডেটা ফ্রেম হিসাবে আউটপুট ।

cell <- function(q, xylim, ...) {
  if (class(q)=="quadtree") f <- cell.quadtree else f <- cell.quadtree.leaf
  f(q, xylim, ...)
}
cell.quadtree <- function(q, xylim, ...) {
  i <- q$index
  j <- 3 - q$index
  clip <- function(xylim.clip, i, upper) {
    if (upper) xylim.clip[1, i] <- max(q$threshold, xylim.clip[1,i]) else 
      xylim.clip[2,i] <- min(q$threshold, xylim.clip[2,i])
    xylim.clip
  } 
  d <- data.frame(id=NULL, x=NULL, y=NULL)
  if(q$threshold > xylim[1,i]) d <- cell(q$lower, clip(xylim, i, FALSE), ...)
  if(q$threshold < xylim[2,i]) d <- rbind(d, cell(q$upper, clip(xylim, i, TRUE), ...))
  d
}
cell.quadtree.leaf <- function(q, xylim) {
  data.frame(id = q$id, 
             x = c(xylim[1,1], xylim[2,1], xylim[2,1], xylim[1,1], xylim[1,1]),
             y = c(xylim[1,2], xylim[1,2], xylim[2,2], xylim[2,2], xylim[1,2]))
}

পয়েন্টগুলি সেগুলি সরাসরি ব্যবহার করে read.shpবা (x, y) স্থানাঙ্কের একটি ডেটা ফাইল আমদানি করে পড়া যায় ।

ব্যবহারের উদাহরণ:

qt <- quadtree(xy, k)
xylim <- cbind(x=c(min(xy[,1]), max(xy[,1])), y=c(min(xy[,2]), max(xy[,2])))
polys <- cell(qt, xylim)
polys.attr <- data.frame(id=unique(polys$id))
library(shapefiles)
polys.shapefile <- convert.to.shapefile(polys, polys.attr, "id", 5)
write.shapefile(polys.shapefile, "f:/temp/quadtree", arcgis=TRUE)

( xylimউপমহলে উইন্ডো করতে বা বৃহত্তর অঞ্চলে ম্যাপিং প্রসারিত করতে এখানে যে কোনও পছন্দসই সীমা ব্যবহার করুন; এই কোডটি পয়েন্টগুলির সীমাতে ডিফল্ট হয়))

এটি একাই যথেষ্ট: মূল পয়েন্টগুলিতে এই বহুভুজগুলির একটি স্থানিক যোগদান ক্লাস্টারগুলি সনাক্ত করবে। একবার চিহ্নিত হয়ে গেলে, ডাটাবেস "সংক্ষিপ্তকরণ" ক্রিয়াকলাপগুলি প্রতিটি ঘরের মধ্যে পয়েন্টগুলির সংক্ষিপ্ত পরিসংখ্যান তৈরি করে।


কি দারুন! ফ্যান্টাস্টিক। অফিসে একবারে এটি আমার ডেটা দিয়ে শট দেবে =)
রাডেক

4
শীর্ষ উত্তর @ হুবুহু! +1
মিরসিভিকিং

1
(1) আপনি (সাথে সরাসরি shapefiles পড়তে পারেন ইন্টার আলিয়া ) shapefilesপ্যাকেজ বা অন্য আপনি ASCII টেক্সট (X, Y) স্থানাঙ্ক রপ্তানি এবং তাদের সঙ্গে পড়তে পারেন read.table। (২) আমি qtদুটি রূপে লেখার পরামর্শ দিচ্ছি : প্রথমত, xyযেখানে idক্ষেত্রগুলি ক্লাস্টার সনাক্তকারী হিসাবে অন্তর্ভুক্ত করা হয়েছে তার জন্য পয়েন্ট শেফফাইল হিসাবে; দ্বিতীয়ত, যেখানে প্লট করা লাইন বিভাগগুলিকে lines.quadtreeপললাইন শেফফাইল (বা যেখানে অ্যানালগাস প্রসেসিংগুলি সেলগুলি বহুভুজ শেফফাইল হিসাবে লিখেছে) হিসাবে লিখিত আছে। এটি আয়তক্ষেত্রের মতো lines.quadtree.leafআউটপুট পরিবর্তন করার মতই সহজ xylim। (সম্পাদনাগুলি দেখুন।)
whuber

1
@ শুভ একটি আপডেটের জন্য অনেক ধন্যবাদ। সবকিছু সুচারুভাবে কাজ করেছিল। ভাল +50 প্রাপ্য, যদিও এখন আমি মনে করি এটি +500 এর প্রাপ্য!
রাদেক

1
আমার সন্দেহ হয় গণনা করা এইডগুলি কোনও কারণে অনন্য ছিল না। সংজ্ঞা এই পরিবর্তনগুলি করুন quad: (1) আরম্ভ id=1; (2) পরিবর্তন id/2করার id*2মধ্যে lower=লাইন; (3) একটি অনুরূপ পরিবর্তন id*2+1মধ্যে upper=লাইন। (আমি এটি প্রতিফলিত করতে আমার জবাবটি সম্পাদনা করব)) এটির ক্ষেত্রে অঞ্চল গণনাটিও যত্ন নেওয়া উচিত: আপনার জিআইএসের উপর নির্ভর করে সমস্ত অঞ্চল ইতিবাচক হবে বা সমস্ত নেতিবাচক হবে। যদি সেগুলি সমস্ত নেতিবাচক হয় তবে তালিকাগুলিকে জন্য xএবং yএর বিপরীতে cell.quadtree.leaf
শুক্র

6

দেখুন এই অ্যালগরিদমটি আপনার ডেটা নমুনার জন্য যথেষ্ট নাম দেয় না:

  1. একটি নিয়মিত গ্রিড দিয়ে শুরু করুন
  2. বহুভুজের যদি প্রান্তিকের চেয়ে কম থাকে, তবে প্রতিবেশী পর্যায়ক্রমে (ই, এস, ডাব্লু, এন) ঘড়ির কাঁটার দিকে ঘূর্ণায়মানের সাথে একীভূত হন।
  3. বহুভুজের যদি প্রান্তিকের চেয়ে কম থাকে, 2 এ যান, অন্যথায় পরবর্তী বহুভুতে যান

উদাহরণস্বরূপ, যদি সর্বনিম্ন প্রান্তিক মান 3 হয়:

অ্যালগরিদম


1
শয়তান বিশদে রয়েছে: মনে হচ্ছে এই পদ্ধতির (বা প্রায় কোনও আগ্রাসী ক্লাস্টারিং অ্যালগরিদম) সমস্ত জায়গায় ছোট ছোট "এতিম" পয়েন্টগুলি ছড়িয়ে দেওয়ার হুমকি দেয়, যার পরে প্রক্রিয়া করা যায় না। আমি বলছি না যে এই পদ্ধতিটি অসম্ভব, তবে আমি একটি বাস্তব অ্যালগরিদমের অনুপস্থিতিতে এবং এর প্রয়োগের উদাহরণকে বাস্তববাদী পয়েন্ট ডেটাসেটের জন্য একটি স্বাস্থ্যকর সংশয় বজায় রাখতে চাই।
whuber

প্রকৃতপক্ষে এই পদ্ধতির সমস্যা হতে পারে। এই পদ্ধতির একটি অ্যাপ্লিকেশন যা আমি ভাবছিলাম আবাসিক বিল্ডিংয়ের উপস্থাপনা হিসাবে পয়েন্টগুলি ব্যবহার করে। আমি মনে করি এই পদ্ধতিটি আরও ঘন জনবহুল অঞ্চলে ভালভাবে কাজ করবে। তবে, এমন ঘটনা এখনও ঘটতে পারে যখন 'কোথাও'র মাঝখানে' আক্ষরিক অর্থে একটি বা দুটি বিল্ডিং থাকে এবং এতে প্রচুর পরিমাণে পুনরাবৃত্তি হয় এবং অবশেষে ন্যূনতম প্রান্তে পৌঁছতে সত্যই বড় অঞ্চলগুলি দেখা দেয়।
রাদেক

5

পাওলো এর আকর্ষণীয় সমাধানের মতো, কোয়াড ট্রি মহকুমার অ্যালগোরিদম ব্যবহার সম্পর্কে কীভাবে?

আপনি যে চতুর্দিকে যেতে চান তার গভীরতা সেট করুন। আপনার প্রতি সেল প্রতি ন্যূনতম বা সর্বাধিক সংখ্যক পয়েন্ট থাকতে পারে তাই কিছু নোড অন্যের চেয়ে গভীর / ছোট হতে পারে।

খালি নোডগুলি ত্যাগ করে আপনার বিশ্বকে উপ-বিভাজন করুন। মানদণ্ড পূরণ না হওয়া পর্যন্ত ধুয়ে ফেলুন এবং পুনরাবৃত্তি করুন।


ধন্যবাদ। আপনি কি জন্য সফ্টওয়্যার সুপারিশ করবেন?
রাদেক

1
নীতিগতভাবে এটি একটি ভাল ধারণা। আপনি যদি প্রতি সেল প্রতি ইতিবাচক ন্যূনতম সংখ্যার চেয়ে কম মঞ্জুরি না দেন তবে খালি নোডগুলি কীভাবে উত্থিত হবে? (সেখানে quadtrees অনেক ধরনের, তাই খালি নোড সম্ভাবনা ইঙ্গিত আপনি মনের এক যে ডেটা, যা অভিপ্রেত কাজের জন্য তার উপযোগিতা সম্পর্কে উদ্বেগ উত্থাপন অভিযোজিত করা হয় না আছে আছে।)
whuber

1
আমি এটি এর মতো চিত্র: কল্পনা করুন যে কোনও নোডের পয়েন্টের সর্বাধিক প্রান্তিকের চেয়ে বেশি রয়েছে তবে সেগুলি নোডের উপরের-বাম দিকে ক্লাস্টারযুক্ত। নোডটি বিভক্ত হবে তবে নীচের ডানদিকে থাকা শিশু নোডটি খালি থাকবে, তাই এটি ছাঁটাই করা যেতে পারে।
মিরসিভিকিং

1
আমি দেখতে পাচ্ছি আপনি কি করছেন (+1)। কৌশলটি হ'ল স্থানাঙ্কগুলি (যেমন তাদের মধ্যম) দ্বারা নির্ধারিত বিন্দুতে উপ-বিভাগ করা, যার ফলে খালি কোষের গ্যারান্টি নেই। অন্যথায়, চতুর্ভুজটি মূলত পয়েন্ট দ্বারা দখল করা স্থান দ্বারা নির্ধারিত হয় এবং পয়েন্টগুলি নিজের দ্বারা নয়; আপনার পন্থাটি তখন @ পাওলো দ্বারা প্রস্তাবিত জেনেরিক ধারণাটি কার্যকর করার কার্যকর উপায় হয়ে ওঠে।
whuber

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.