الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مساعدة في برمجة breadth first باستخدام ms sql

بدأه adham enaya في 5 مايو 2010 · 2 رد · 500 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ,,,

اخواني الاعزاء ...

كما هو وضاح من العنوان ,, هل ممكن ان تساعدوني في برمجة خوارزمية breadth first باستخدام كود ms sql ???

,ولكم جزيل الشكر

#2

الافضل كتابتها بال C# او دمج ال CLR مع ال MS SQL لانه باستخدام ال T-SQL وحدها لن يمكنك

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#3

اخي وجدت كود أعتقد انه يفي بالغرض ...

في الكود التالي افترض وجود جدول تخزن فيه النودز للجراف المراد البحث فيه واسمه vertices يتكون من عمودين فقط aid,bid من نوع int

CREATE PROCEDURE [dbo].[BFS](
	@FROM INT,
	@TO INT
)
AS

BEGIN
	DECLARE @Nodes TABLE (Generation INT, p INT, r INT, UNIQUE(p, r))
	DECLARE @Generation INT

	SELECT @Generation = 0

	INSERT @Nodes
		(
			Generation,
			p
		)
	SELECT	@Generation,
			@FROM

	WHILE @@ROWCOUNT > 0 AND NOT EXISTS (SELECT * FROM @Nodes WHERE p = @TO)
		BEGIN
			SELECT @Generation = @Generation + 1

			INSERT	@Nodes
				(
					Generation,
					p,
					r
				)

			SELECT	@Generation,
					bid,
					aid
			FROM	vertices
			WHERE	aid IN (SELECT p FROM @Nodes WHERE Generation = @Generation - 1)
				AND bid NOT IN (SELECT p FROM @Nodes)
			UNION
			SELECT	@Generation,
				aid,
				bid
			FROM	vertices
			WHERE	bid IN (SELECT p FROM @Nodes WHERE Generation = @Generation - 1)
				AND aid NOT IN (SELECT p FROM @Nodes)

		END

	-- Backtracing method: Traces the route back from target to start

	DECLARE @Backtrace TABLE
	( p INT )

	INSERT @Backtrace VALUES(@TO)

	WHILE @Generation > 0
		BEGIN
			DELETE FROM @Nodes
			WHERE Generation = @Generation
				AND p NOT IN(SELECT p FROM @Backtrace)

			INSERT @Backtrace
				( p )

			SELECT DISTINCT r
			FROM @Nodes
			WHERE Generation = @Generation

			SELECT @Generation = @Generation - 1
		END
END

SELECT * FROM @Nodes ORDER BY Generation, r, p

تم تعديل هذه المشاركة بواسطة adham enaya في 5 مايو 2010 في 22:52

مواضيع مشابهة